2012-12-21 4 views
8

że dwie następujące tabele. Używam programu SQL Server 2008 R2lewa zewnętrzna przyłączyć t SQL

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 

ta zwraca zestaw wyników

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

chciałbym mieć następujący wynik ustawić

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

Teraz jestem acheiving to poprzez stworzenie nowa tabela z krzyżem przyłączyć tak, a potem robi się sprzężenie zewnętrzne

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 

Czy istnieje lepszy sposób to zrobić?

Dzięki

+0

+1 dla utworzenia SQL –

+1

SQL konfiguracja jest miłe. Jednakże, należy unikać „*” S w zapytaniach, bo to zajmuje trochę rozszyfrowania, aby dowiedzieć się, które kolumny pochodzą które tabele. –

Odpowiedz

3

aby uzyskać to, co chcesz, musisz "jazdy" tabeli. Oznacza to, że chcesz uzyskać pełną listę wszystkich kombinacji, a następnie dołączyć do innych tabel, aby uzyskać dopasowania. Oto jeden sposób:

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 
+0

Tak. Robię coś podobnego do tego, co robisz. Miałem nadzieję, że może pojawią się nowe klauzule SQL, takie jak cross apply, outer apply itp., Które uprości kod. – Satfactor

+1

Gordon ma on rację, trzeba mieć „jazdy” tabeli w tym celu. Mamy kod bardzo podobny do tego, aby osiągnąć to samo. Nie ma nic prostszego w tworzeniu tego typu zapytań. – CodeLikeBeaker

0

Co szukasz jest iloczyn wartości w # TBL1 i wartościami w kolumnie ID w # TBL2. Ponieważ wartości w # tbl2.id nie są wyjątkowe może być lepszy projekt, aby mieć dodatkowy stół z rzędem dla każdej wartości # tbl2.id. Następnie można użyć tego rozwiązania:

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; 

Jeśli to nie jest opcja to użycie zamiast:

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;