ticket
とattr
の2つのテーブルがあります。テーブルticket
にはticked_id
フィールドと他のいくつかのフィールドがあります。テーブルattr
には3つのフィールドがあります。
ticket_id - numeric
attr_type - numeric
attr_val - string
attr_type
は、値の固定列挙です。たとえば、1
、2
、または3
になります。
クエリを作成する必要があり、その結果は4列になります。
ticket_id
、attr_val
for attr_type=1
、attr_val
for attr_type=2
、attr_val
for attr_type=3
attr
テーブルにattr_type
に対応する値がない場合、対応する列にNULL値が表示されます。
例:
ticket
ticket_id: 1
ticket_id: 2
ticket_id: 3
attr
ticket_id: 1
attr_type: 1
attr_val: Foo
ticket_id: 1
attr_type: 2
attr_val: Bar
ticket_id: 1
attr_type: 3
attr_val: Egg
ticket_id: 2
attr_type: 2
attr_val: Spam
結果は次のようになります。
ticked_id: 1
attr_val1: Foo
attr_val2: Bar
attr_val3: Egg
ticked_id: 2
attr_val1: NULL
attr_val2: Spam
attr_val3: NULL
ticked_id: 3
attr_val1: NULL
attr_val2: NULL
attr_val3: NULL
attr
テーブルに3回左結合しようとしましたが、attr_type
による出力の配置方法がわかりません。
複数のLEFT JOINs
を使用する必要があります:
SELECT
ticket.ticket_id,
a1.attr_val AS attr_val1,
a2.attr_val AS attr_val2,
a3.attr_val AS attr_val3
FROM ticket
LEFT JOIN attr a1 ON ticket.ticket_id=a1.ticket_id AND a1.attr_type=1
LEFT JOIN attr a2 ON ticket.ticket_id=a2.ticket_id AND a2.attr_type=2
LEFT JOIN attr a3 ON ticket.ticket_id=a3.ticket_id AND a3.attr_type=3
以下に例を示します。 SQL Fiddle 。
エイリアス化された左結合を使用できますが、この場合、グループ化と条件式の組み合わせを使用することもできます。
select t.ticket_id,
max(case when a.attr_type=1 then a.attr_val end) attr_val1,
max(case when a.attr_type=2 then a.attr_val end) attr_val2,
max(case when a.attr_type=3 then a.attr_val end) attr_val3
from ticket t
left join attr a on t.ticket_id = a.ticket_id
group by t.ticket_id
テーブルエイリアスを使用します
例えば:
Select
ticket.ticket_id,
a1.attr_val as attr_val1,
a2.attr_val as attr_val2,
a3.attr_val as attr_val3
from ticket
left join (select * from attr where attr_type=1) a1 on ticket.ticket_id=a1.ticket_id
left join (select * from attr where attr_type=2) a2 on ticket.ticket_id=a2.ticket_id
left join (select * from attr where attr_type=3) a3 on ticket.ticket_id=a3.ticket_id