我有 2 個表,我想從第一個表中獲取所有記錄,并從第二個表中獲取額外記錄。
表 A
----- --------- ---------
| ID | NAME | TASK |
----- --------- ---------
| 101 | Alan | Prepare |
----- --------- ---------
| 102 | Fabien | Approve |
----- --------- ---------
| 103 | Christy | Plan |
----- --------- ---------
| 104 | David | Approve |
----- --------- ---------
| 105 | Eric | Set |
----- --------- ---------
表 B
----- --------- ---------
| ID | NAME | TASK |
----- --------- ---------
| 101 | Richy | Prepare |
----- --------- ---------
| 103 | Girish | Plan |
----- --------- ---------
| 106 | Fleming | Approve |
----- --------- ---------
| 107 | Ian | Set |
----- --------- ---------
預期產出
----- --------- ---------
| ID | NAME | TASK |
----- --------- ---------
| 101 | Alan | Prepare |
----- --------- ---------
| 102 | Fabien | Approve |
----- --------- ---------
| 103 | Christy | Plan |
----- --------- ---------
| 104 | David | Approve |
----- --------- ---------
| 105 | Eric | Set |
----- --------- ---------
| 106 | Fleming | Approve |
----- --------- ---------
| 107 | Ian | Set |
----- --------- ---------
我試過使用LEFT JOIN. 但我只從左表得到所有。
select * from A left join B on A.ID=B.ID and B.ID is NULL
我也嘗試過UNION,UNION ALL但由于Name在 2 個表中可能不同,我得到了兩個記錄。可以使用一種解決方案,NOT IN但它對我來說很重要,因為我在這里將大查詢稱為表 A 和 B。我不知道我錯過了什么。它應該很簡單,但現在我并不感到驚訝。請幫忙。
uj5u.com熱心網友回復:
我正在考慮一個聯合ROW_NUMBER計算列的幫助:
WITH cte AS (
SELECT ID, NAME, TASK, 1 AS SRC FROM TableA
UNION ALL
SELECT ID, NAME, TASK, 2 FROM TableB
),
cte2 AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY SRC) rn
FROM cte
)
SELECT ID, NAME, TASK
FROM cte2
WHERE rn = 1;
這里的想法是構建一個包含兩個表中所有記錄的中間表。我們引入了一個計算列來跟蹤表源,并賦予 A 記錄比 B 記錄更高的優先級。使用ROW_NUMBER允許我們選擇 A 記錄而不是具有相同 的 B 記錄ID。
uj5u.com熱心網友回復:
Full outer join 將起作用,因為完全連接將從兩個表中獲取所有匹配和不匹配的記錄
;with tablea as
(
select 101 as id, 'Alan' name, 'Prepare ' as task
union select 102 , 'Fabien' , 'Approve'
union select 103 , 'Christy' , 'Plan '
union select 104 , 'David' , 'Approve '
union select 105 , 'Eric' , 'Set ')
,tableb as (
select 101 as ID ,'Richy ' as NAME ,' Prepare ' as TASK
union select 103 ,'Girish ',' Plan '
union select 106 ,'Fleming',' Approve '
union select 107 ,'Ian ',' Set '
)
select isnull(a.id,b.id) as id, isnull(a.name,b.name) as name, isnull(a.task,b.TASK) from tablea a
full outer join tableb b on a.id = b.ID
結果

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/422053.html
標籤:
上一篇:如何在SQL中轉換日期格式?
