我有 2 個具有相同資料結構的不同表,表 A 和 B,是否可以從 A 和 B 獲取值,如果 ID 條目存在于 B 中,它會替換在 A 中獲取的值?
例子:
select '1' as id, 'Bob' as "user" from dual
union
select '1' as id, 'Alice' as "user" from dual
這將回傳:
1 Bob
1 Alice
如果id在第二個選擇中相同,我只想有一行:
1 Alice
uj5u.com熱心網友回復:
您需要一個“FULL OUTER JOIN”而不是 UNION,它將為您提供三種型別的行:
- 兩個表都具有匹配 id 的行,以及來自兩個表的值(INNER JOIN 將回傳的行)
- 只有表 A 具有該 ID 的行,表 B 的列為 null(LEFT OUTER JOIN 將回傳的附加行)
- 只有表 B 具有該 ID 的行,表 A 的列為空(右外連接將回傳的附加行)
然后,您可以使用 COALESCE 從 B(如果存在)(第一種和第二種型別的行)獲取值,如果不存在(第三種型別的行),則可以使用 A。
所以對于你的例子:
Select
Coalesce(B.id, A.id) as id,
Coalesce(B."user", A."user") as "user"
From
(select '1' as id, 'Bob' as "user" from dual) as A
Full Outer Join
(select '1' as id, 'Alice' as "user" from dual) as B
On B.id = A.id
回傳:
| ID | 用戶 |
|---|---|
| 1 | 愛麗絲 |
(注意:在 SQL Server 上通過洗掉“from dual”進行測驗,因為我沒有要測驗的 Oracle DB。)
uj5u.com熱心網友回復:
一種方法是:
select '1' as id, 'Bob' as "user" from table_A
where id not in (select id from table_B)
union all
select '1' as id, 'Alice' as "user" from table_B
uj5u.com熱心網友回復:
您可以使用 ROW_NUMBER() over (PARTITION BY id order by tab) 嘗試這種方式,其中“tab”是表名,在本示例中,來自 table_a 的資料將獲得優先級并被拾取。
create table table_a as
(
select '1' as id, 'Bob' as "user" from dual
UNION
select '2' as id, 'Jack' as "user" from dual
) ;
create table table_b as
(
select '1' as id, 'Alice' as "user" from dual -- table
UNION
select '3' as id, 'John' as "user" from dual -- table
) ;
select * from (
select ROW_NUMBER() over (PARTITION BY id order by tab) rnum,id, "user"
from(
select id, "user", 'A' tab from table_a
union all
select id, "user", 'b' tab from table_b
)
) WHERE RNUM = 1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/349312.html
