8

次の2つのテーブルがあります。SQL Server2008R2を使用しています

Create table #tmp1 (
a char(1)
)

Create table #tmp2 (
id int,
a char(1),
val int
)

insert #tmp1 values ('A')
insert #tmp1 values ('B')
insert #tmp1 values ('C')

insert #tmp2 values (1,  'A', 10)
insert #tmp2 values (1,  'B', 20)
insert #tmp2 values (2,  'A', 30)
insert #tmp2 values (2,  'C', 40)

select * from #tmp1 t1 left outer join #tmp2 t2 on t1.a = t2.a
order by t2.id

これにより、結果セットが返されます

A   1   A   10
B   1   B   20
C   2   C   40
A   2   A   30

次の結果セットが欲しいのですが

 A     1    A       10
 B     1    B       20
 C     1    null    null
 A     2    A       30
 B     2    null    null
 C     2    C       40

現在、このようなクロス結合を使用して新しいテーブルを作成し、外部結合を実行することで、これを実現しています。

select * into #tmp3 from #tmp1 cross join (select distinct ID from #tmp2) t
select * from #tmp3 t1 left outer join #tmp2 t2 on t1.a = t2.a and t1.id = t2.id

これを行うためのより良い方法はありますか?

ありがとう

4

2 に答える 2

3

欲しいものを手に入れるには、「運転」テーブルが必要です。つまり、すべての組み合わせの完全なリストが必要であり、次に他のテーブルに結合して一致を取得する必要があります。これが1つの方法です:

select t1.a, t2.*
from (select t1.a as a, t2.id as id
      from (select distinct a from #tmp1 t1) t1
           cross join
           (select distinct id from #tmp2 t2) t2
     ) driving left outer join
     #tmp1 t1
     on t1.a = driving.a left outer join
     #tmp2 t2
     on t2.id = driving.id and
        t2.a = driving.a
order by t2.id
于 2012-12-21T16:33:49.333 に答える
0

探しているのは、#tbl1の値と#tbl2のid列の値のデカルト積です。#tbl2.idの値は一意ではないため、#tbl2.idの値ごとに1つの行を持つ追加のテーブルを用意する方が適切な設計になる可能性があります。次に、このソリューションを使用できます。

Create table #tmp1 (
a char(1)
)

Create table #tmp2 (
id int,
a char(1),
val int
)

Create table #tmp3 (
id int
)

insert #tmp1 values ('A')
insert #tmp1 values ('B')
insert #tmp1 values ('C')

insert #tmp3 values (1)
insert #tmp3 values (2)

insert #tmp2 values (1,  'A', 10)
insert #tmp2 values (1,  'B', 20)
insert #tmp2 values (2,  'A', 30)
insert #tmp2 values (2,  'C', 40)

SELECT  t3.id,t1.a,t2.val
FROM    #tmp1 AS t1
CROSS JOIN #tmp3 AS t3
LEFT OUTER JOIN #tmp2 AS t2
ON t1.a = t2.a AND t3.id = t2.id
ORDER BY t3.id, t1.a;

それがオプションでない場合は、代わりにこれを使用してください。

SELECT  t3.id,t1.a,t2.val
FROM    #tmp1 AS t1
CROSS JOIN (SELECT DISTINCT id FROM #tmp2) AS t3
LEFT OUTER JOIN #tmp2 AS t2
ON t1.a = t2.a AND t3.id = t2.id
ORDER BY t3.id, t1.a;
于 2012-12-21T16:49:53.157 に答える