目前有A,B兩張表,如何在A表的基礎上,使得A.A=B.A 且 A.B=B.B的D欄位資料匹配到A表中,同時,不滿足條件的資料對應欄位為0,不會被過濾掉(相當于合并),類似效果就是在excel用lookup函式進行匹配并將AB兩表進行合并。
也就是想要的效果如下:
A B C D
張三 M 100 FD1
李四 F 200 0
李四 M 0 DF3
王武 F 212 DFG1
劉七 M DSF1 DSF1
------------------------------
其中A表資料格式如下:
A B C
張三 M 100
李四 F 200
王武 F 212
B表的資料格式如下:
A B D
張三 M FD1
李四 M DF3
王武 F DFG1
劉七 M DSF1
uj5u.com熱心網友回復:
if OBJECT_ID('tempdb..#A') is not null
begin
drop table #A
end
if OBJECT_ID('tempdb..#B') is not null
begin
drop table #B
end
select * into #A from(
select '張三' A,'M' B,100 C union all
select '李四' ,'F' ,200 union all
select '王武' ,'F' ,212
)t
select * into #B from(
select '張三' A,'M' B,'FD1' D union all
select '李四' ,'M' ,'DF3' union all
select '王武' ,'F' ,'DFG1' union all
select '劉七' ,'M' ,'DSF1'
)t
;
with cte as(
select a.A,a.B from #A a union
select b.A,b.B from #B b
)
select cte.*,isnull(a.C,0) C,isnull(b.D,0) D from cte
left join #A a on cte.A = a.A and cte.B = a.B
left join #B b on cte.A = b.A and cte.B = b.B
uj5u.com熱心網友回復:
你的結果劉七C列應該填錯了吧CREATE TABLE #A(A VARCHAR(50),B VARCHAR(50),C INT)
INSERT INTO #A
SELECT '張三','M',100 UNION ALL
SELECT '李四','F',200 UNION ALL
SELECT '王武','F',212
CREATE TABLE #B(A VARCHAR(50),B VARCHAR(50),D VARCHAR(50))
INSERT INTO #B
SELECT '張三','M','FD1' UNION ALL
SELECT '李四','M','DF3' UNION ALL
SELECT '王武','F','DFG1' UNION ALL
SELECT '劉七','M','DSF1'
SELECT DISTINCT C.*,ISNULL(C,0) AS C,ISNULL(B.D,'0') AS D
FROM(
SELECT A.A,A.B FROM #A A
UNION ALL
SELECT B.A,B.B FROM #B B) C
LEFT JOIN #A A ON A.A=C.A AND A.B=C.B
LEFT JOIN #B B ON B.A=C.A AND B.B=C.B
/*
A B C D
李四 F 200 0
李四 M 0 DF3
劉七 M 0 DSF1
王武 F 212 DFG1
張三 M 100 FD1
*/
uj5u.com熱心網友回復:
有一個問題我沒有說清楚,其實A 和B 表每一個欄位有非常非常多的數字,如果一直用select 的話,這代碼太長了,可否用其他辦法?uj5u.com熱心網友回復:
CREATE TABLE #A(A VARCHAR(50),B VARCHAR(50),C INT)
INSERT INTO #A
SELECT '張三','M',100 UNION ALL
SELECT '李四','F',200 UNION ALL
SELECT '王武','F',212
CREATE TABLE #B(A VARCHAR(50),B VARCHAR(50),D VARCHAR(50))
INSERT INTO #B
SELECT '張三','M','FD1' UNION ALL
SELECT '李四','M','DF3' UNION ALL
SELECT '王武','F','DFG1' UNION ALL
SELECT '劉七','M','DSF1'
SELECT XX.A,XX.B,MAX(XX.C) C,MAX(XX.D) D FROM (
SELECT A.A A,A.B B,A.C C,'0' D FROM #A A
UNION ALL
SELECT B.A A,B.B B,0 C,B.D D FROM #B B) XX GROUP BY XX.A,XX.B
DROP TABLE #A,#B
uj5u.com熱心網友回復:
SELECT ISNULL(A.A,B.A) AS A,ISNULL(A.B,B.B) AS B,
ISNULL(A.C,0) AS C,ISNULL(B.D,0) AS D
FROM TABLE_A A
FULL JOIN TABLE_B B ON A.A=B.A AND A.B=B.B
uj5u.com熱心網友回復:
你是表的數量很多,還是表的行數很多
如果是前者,表名沒有規律那就只能手打,長sql陳述句是避免不了的;表名有規律,還可以試用下動態sql陳述句
如果是后者,前邊幾層樓的回復完全沒有問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/236298.html
標籤:應用實例
