46

私は2つのテーブルticketattr. テーブルticketにはticked_idフィールドと他のいくつかのフィールドがあります。テーブルattrには 3 つのフィールドがあります。

ticket_id - numeric
attr_type - numeric
attr_val - string

attr_type値の固定列挙です。たとえば、12または3です。

クエリを作成する必要があり、その結果は 4 列になります。

ticket_idattr_valattr_type=1、、attr_valのためにattr_type=2attr_valattr_type=3

attr_typeテーブルに対応する値がない場合はattr、対応する列に 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

テーブルの結合を 3 回試みましattrたが、出力を配置する方法がわかりません。attr_type

4

3 に答える 3

75

複数使用する必要があります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

次に例を示します:SQLFiddle

于 2012-09-24T09:15:44.293 に答える
10

エイリアス化された左結合を使用できますが、この場合、グループ化と条件式を組み合わせて使用​​することもできます。

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
于 2012-09-24T09:23:56.810 に答える
9

テーブル エイリアスを使用する

例えば:

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
于 2012-09-24T08:58:51.013 に答える