2017-11-21 11 views
0

私はビューでこれを自分自身で実行しようとしましたが、残念ながら私は必要なスキルや知識がありません。SQLクエリの作成でいくつかのテーブルが参照される

デモ用のデータをいくつか入れました。 = object_uri

TABLE_RECORD

+-----+---------------+---------+ 
| uri |  title  | client | 
+-----+---------------+---------+ 
| 1 | australia  | peter | 
| 2 | new zealand | peter | 
| 3 | canada  | chris | 
| 4 | united states | mitch | 
| 5 | ireland  | michael | 
| 6 | scotland  | mitch | 
+-----+---------------+---------+ 

TABLE_UDF

+------------+--------------+----------------+ 
| object_uri | udf_type_uri | udf_type_value | 
+------------+--------------+----------------+ 
|   1 |   2005 | 1/12/2007  | 
|   2 |   2005 | 2/04/2008  | 
|   2 |   2006 | 3/04/2009  | 
|   3 |   2005 | 4/05/2010  | 
|   4 |   2006 | 12/04/2016  | 
|   5 |   2005 | 14/05/2005  | 
|   5 |   2006 | 14/05/2006  | 
|   6 |   2005 | 20/01/2017  | 
+------------+--------------+----------------+ 

予想出力

もちろん

URI

+-----+---------------+---------+------------+------------+ 
| uri |  title  | client | udf_type_1 | udf_type_2 | 
+-----+---------------+---------+------------+------------+ 
| 1 | australia  | peter | 1/12/2007 |   | 
| 2 | new zealand | peter | 2/04/2008 | 3/04/2009 | 
| 3 | canada  | chris | 4/05/2010 |   | 
| 4 | united states | mitch |   | 12/04/2016 | 
| 5 | ireland  | michael | 14/05/2005 | 14/05/2006 | 
| 6 | scotland  | mitch | 20/01/2017 |   | 
+-----+---------------+---------+------------+------------+ 

アドバンスドヒープ。

+1

あなたの質問はどこですか? – Eric

答えて

0
SELECT 
    * 
FROM 
    table_record 
LEFT JOIN 
(
    SELECT 
     object_uri, 
     MAX(CASE WHEN udf_type_uri = 2005 THEN udf_type_value END) AS udf_type_1, 
     MAX(CASE WHEN udf_type_uri = 2006 THEN udf_type_value END) AS udf_type_2 
    FROM 
     table_udf 
    GROUP BY 
     object_uri 
) 
    table_udf 
     ON table_udf.object_uri = table_record.uri 

内側問合せは、ダウンuriごとに1つの行にudfテーブルをスカッシュ、正しいUDFが正しい列に配置されていることを確認するためにMAX()CASEを使用します。次に、通常の方法でテーブルを結合します。

PIVOTを使用してもを行うことができますが、それは常に私にclunkier思われます...) https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

1

私が正しく理解していれば、これは条件付きの集約とjoin次のとおりです。

select r.uri, r.title, r.client, 
     max(case when u.udf_type_uri = 2005 then udf_type_value end) as udf_type_1, 
     max(case when u.udf_type_uri = 2006 then udf_type_value end) as udf_type_2 
from record r join 
    udf u 
    on r.uri = u.object_uri 
group by r.uri, r.title, r.client; 
+0

コンポジットキーでグループ化すると、パフォーマンスに何らかの目に見える影響がありますか?私のガット本能は、代理キーでグループ化し、次に参加することです。 – MatBailie

+0

@MatBailie。 。 。どちらが良いかは、 'join 'が行をフィルタリングするかどうか、テーブルのインデックス、テーブルの相対的なサイズなど、多くの要因によって決まります。 。 。 –

+0

どちらの場合でもこれらの要因は同じではないでしょうか?あなたは同じキーで同じテーブルにまだ参加していますが、1つは集計されています。 URIに索引がある場合は、結合の目的で難読化されませんか?しかし、インデックスがない場合、サロゲートキーと2つの文字列プロパティによるグループ化は、理想よりも低いようですか? – MatBailie

関連する問題