2012-12-21 42 views
8

Tôi có hai bảng sau đây. Tôi đang sử dụng SQL Server 2008 R2tham gia bên ngoài bên trái trong 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 

này trả kết quả thiết

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

Tôi muốn có kết quả sau thiết

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

Ngay bây giờ tôi đang acheiving này bằng cách tạo một bảng mới với một tham gia chéo như thế này và sau đó làm một tham gia bên ngoài

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 

Có cách nào tốt hơn để thực hiện việc này không?

Cảm ơn

+0

+1 cho thiết lập SQL –

+1

Quá trình cài đặt SQL là tốt đẹp. Tuy nhiên, bạn nên tránh "*" trong các truy vấn, vì phải mất một số giải mã để tìm ra cột nào đến từ bảng nào. –

Trả lời

3

Để nhận được những gì bạn muốn, bạn cần một bảng "lái xe". Đó là, bạn muốn có một danh sách đầy đủ của tất cả các kết hợp, và sau đó để tham gia vào các bảng khác để có được các trận đấu. Dưới đây là một cách:

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

Có. Tôi đang làm một cái gì đó tương tự như những gì bạn đang làm. Tôi đã hy vọng có thể có một số mệnh đề SQL mới như áp dụng chéo, bên ngoài áp dụng vv mà sẽ làm cho mã đơn giản hơn. – Satfactor

+1

Gordon có quyền, bạn cần phải có một bảng "lái xe" để làm điều này. Chúng tôi có mã rất giống với điều này để thực hiện điều tương tự. Không có gì đơn giản về việc làm kiểu truy vấn này hoạt động. – CodeLikeBeaker

0

Điều bạn đang tìm kiếm là một sản phẩm Descartes của các giá trị trong # tbl1 và các giá trị trong cột id trong # tbl2. Bởi vì các giá trị trong # tbl2.id không phải là duy nhất nên có thể thiết kế tốt hơn để có một bảng bổ sung với một hàng cho mỗi giá trị # tbl2.id. Sau đó, bạn có thể sử dụng giải pháp này:

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; 

Nếu đó không phải là một sử dụng tùy chọn này để thay thế:

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; 
Các vấn đề liên quan