2017-05-25 76 views
0

我覺得應該有一個簡單的方法來做到這一點。如何將兩個結果集合在一個公共列中?

給定兩個表(ID是主鍵,無重複):

TblQtyNew   TblQtyUsed 

ID | QtyNew   ID | QtyUsed 
1 15    1 7 
2 18    3 21 

如何獲得以下結果?

ID | QtyNew | QtyUsed 
1 15  7 
2 18  NULL 
3 NULL  21 

唯一的解決方案,我想出了包括對ID列UNION然後兩個左聯接:

(SELECT ID FROM TblQtyNew) UNION (SELECT ID FROM TblQtyUsed) as IDs 
LEFT JOIN 
(SELECT QtyNew FROM TblQtyNew) ON TblQtyNew.ID = IDs.ID 
LEFT JOIN 
(SELECT QtyUsed FROM TblQtyUsed) ON TblQtyUsed.ID = IDs.ID 

有沒有更簡單的方法來做到這一點?

回答

1

您可以使用完整的加入和凝聚在如下ID:

select coalesce(t1.id,t2.id) as Id, Qtynew, QtYused 
    from #table1 t1 full join #table2 t2 
    on t1.id = t2.id 

輸出:

+----+--------+---------+ 
    | Id | Qtynew | QtYused | 
    +----+--------+---------+ 
    | 1 | 15  | 7  | 
    | 2 | 18  | NULL | 
    | 3 | NULL | 21  | 
    +----+--------+---------+ 
+0

合併!我知道它正在凝視着我的臉! –

0
select Id, QtyNew, QtyUsed 
from TblQtyNew Full outer join TblQtyUsed 
on TblQtyNew.ID=TBLQtyUsed.ID 
1

你想要一個FULL OUTER JOIN

SELECT COALESCE(T1.ID,T2.ID) as ID, T1.QtyNew, T2.QtyUsed 
FROM TblQtyNew T1 
FULL OUTER JOIN TblQtyUsed T2 on T1.ID = T2.ID 
+0

這會給'NULL'而不是ID 3 – Sami

+0

@Sami Doh,謝謝你Sami,固定。 –

1

使用FULL JOINCase

DECLARE @T1 TABLE (id int , QtyNew int); 
DECLARE @T2 TABLE(id int , QtyUsed int); 

insert into @T1 values (1,15),(2,18); 
insert into @T2 values (1,7),(3,21); 

SELECT ID = case when T1.ID IS not Null then T1.ID else T2.ID end, T1.QtyNew, T2.QtyUsed 
FROM @T1 T1 
full JOIN @T2 T2 on T1.ID = T2.ID 
Order by ID; 

Demo

1

1.

SELECT ID,SUM(ISNULL(QtyNew)) AS QtyNew,SUM(ISNULL(QtyUsed)) AS QtyUsed 
FROM (
    SELECT ID,QtyNew,NULL AS QtyUsed FROM TblQtyNew 
    UNION ALL 
    SELECT ID,NULL QtyNew, QtyUsed FROM TblQtyUsed 
) AS t 
GROUP BY ID 

2.

SELECT COALESCE(n.ID,U.ID) AS ID,n.QtyNew,u.QtyUsed 
FROM TblQtyNew AS n FULL OUTER JOIN TblQtyUsed AS u ON n.ID=u.ID 
1

我故意試圖替代方法。

declare @TblQtyNew table (ID int,QtyNew int) 
insert into @TblQtyNew VALUES 
(1,15)   
,(2,18) 

    declare @TblQtyUsed table (ID int, QtyUsed int) 
    insert into @TblQtyUsed VALUES 
(1 ,7) 
,(3 ,21) 

;with CTE as 
(
select a.id,QtyNew,b.QtyUsed from @TblQtyNew a 
inner join @TblQtyUsed b on a.id=b.ID 
) 
select * from CTE 
union all 
select a.id,QtyNew,null 
from @TblQtyNew a 
where not exists(select id from cte c where c.id=a.id) 

union all 
select a.id,null,QtyUsed 
from @TblQtyUsed a 
where not exists(select id from cte c where c.id=a.id) 
相關問題