3

私はこれをできるだけ効率的に解決しようとしています。

整数のリストを含む単一の列を持つテーブルidsがあるとします。それを「ids」と呼びましょう。

ids
0
1
2
3
4
5
6

そして、いくつかの整数列を持つ別のテーブルitemsがあります。

item1    item2    item3    item4
5        2        2        4
9        2        1        19
0        25       9        2

私がしたいのは、table2 からすべての列を選択することですが、値が「ids」テーブルにない場合は NULL が必要です。したがって、私の結果は次のようになります。

item1    item2    item3    item4
5        2        2        4
NULL     2        1        NULL
0        NULL     NULL     2

これを行うには、項目から選択し、各列のIDに結合します。

SELECT CASE WHEN ids1.id IS NOT NULL THEN items.item1 ELSE NULL,
       CASE WHEN ids2.id IS NOT NULL THEN items.item2 ELSE NULL,
       CASE WHEN ids3.id IS NOT NULL THEN items.item3 ELSE NULL,
       CASE WHEN ids4.id IS NOT NULL THEN items.item4 ELSE NULL,
FROM items
LEFT OUTER JOIN ids ids1 ON (ids1.id = items.item1),
LEFT OUTER JOIN ids ids2 ON (ids2.id = items.item2),
LEFT OUTER JOIN ids ids3 ON (ids3.id = items.item3),
LEFT OUTER JOIN ids ids4 ON (ids4.id = items.item4)

残念ながら、これらのテーブルが大きくなる (数百万行) と、同じテーブルに 4 回参加しなければならないのは非常に面倒です。これを行うためのより高速または効率的な方法はありますか?

ありがとう!

4

1 に答える 1

0

これは、正規化を循環し、id に対してテストするために左結合し、最後に元に戻す例です。

create table ids ( id int );
insert ids values(0),(1),(2),(3),(4),(5),(6);
create table items (itemid int, item1 int, item2 int, item3 int, item4 int);
insert items select
1,5,2,2,4 union all select
2,9,2,1,19 union all select
3,0,25,9,2;

select *
from (
    select u.itemid,ids.id,u.item
    from items
    unpivot (id for item in (item1,item2,item3,item4)) u
    left join ids on ids.id = u.id
) x
pivot (max(id) for item in (item1,item2,item3,item4)) p
于 2012-10-05T02:19:12.547 に答える