我有A表
| id1 | dt |
|---|---|
| x1 | 2022-04-10 |
| a2 | 2022-04-10 |
| a1 | 2022-04-10 |
| x1 | 2022-05-10 |
| x2 | 2022-04-10 |
| y2 | 2022-04-10 |
| y1 | 2022-05-10 |
| x1 | 2022-06-10 |
表 B
| id1 | dt |
|---|---|
| a1 | 2022-04-10 |
| c3 | 2022-04-10 |
| a1 | 2022-05-10 |
| l1 | 2022-05-10 |
| b1 | 2022-04-10 |
| y2 | 2022-04-10 |
| x1 | 2022-06-10 |
| z1 | 2022-05-10 |
注意:A 和 B 具有日期值,但列名不同(表 A 為“dt”,表 B 為“日期”)
期望的輸出:
| id1 | 日期 |
|---|---|
| x1 | 2022-04-10 |
| a2 | 2022-04-10 |
| x2 | 2022-04-10 |
更新 1: 注意:1)y2,a1 不在所需輸出中,因為它們都存在于兩個表中 2)c3 不在所需輸出中,因為它存在于表 B 中
id1 存在于兩個表中,但我只希望表 A 中的“id1”值在 2022 年 4 月 10 日不在表 B 中。
到目前為止采取的步驟:
select id1 from A where dt="2022-04-10" EXCEPT select id1 from B
結果(它運行了很長時間并且超時,不確定它是因為資料量還是查詢錯誤)將使用較小的表進行檢查。
我不能使用左內連接,因為日期列不同(日期與 dt)。
任何幫助將非常感激。
uj5u.com熱心網友回復:
您可以通過UNION在左連接表和右連接表之間應用陳述句來做到這一點。從這些連接中,您的目標是那些由于不匹配而第二個表值為 NULL 的行:
SELECT tableA.id1,
tableA.dt
FROM tableA
LEFT JOIN tableB
ON tableA.id1 = tableB.id1
AND tableA.dt = tableB.dt
WHERE tableB.id1 IS NULL
AND tableA.dt = '2022-04-10'
UNION
SELECT tableB.id1,
tableB.dt
FROM tableB
LEFT JOIN tableA
ON tableB.id1 = tableA.id1
AND tableB.dt = tableA.dt
WHERE tableA.id1 IS NULL
AND tableB.dt = '2022-04-10'
在這里找到 SQL Fiddle 。
編輯
只需要來自表 A 的結果:
SELECT tableA.id1,
tableA.dt
FROM tableA
LEFT JOIN tableB
ON tableA.id1 = tableB.id1
AND tableA.dt = tableB.dt
WHERE tableB.id1 IS NULL
AND tableA.dt = '2022-04-10'
僅來自 B 表?
SELECT tableB.id1,
tableB.dt
FROM tableB
LEFT JOIN tableA
ON tableB.id1 = tableA.id1
AND tableB.dt = tableA.dt
WHERE tableA.id1 IS NULL
AND tableB.dt = '2022-04-10'
uj5u.com熱心網友回復:
我不完全確定你的輸出。但我認為你想要這樣的東西:
bind_rows(
anti_join(rename(a,date=dt) %>% filter(date=="2022-04-10"),b %>% filter(date=="2022-04-10")),
anti_join(b %>% filter(date=="2022-04-10"),rename(a,date=dt) %>% filter(date=="2022-04-10"))
)
輸出:
id1 date
1: x1 2022-04-10
2: a2 2022-04-10
3: x2 2022-04-10
4: y2 2022-04-10
5: a1 2022-04-10
6: c3 2022-04-10
7: b1 2022-04-10
uj5u.com熱心網友回復:
這也有效
with A as (
select distinct id1
from Table_A
where dt = '2022-04-10'
)
, B as (
select distinct id1
from Table_B
where date = '2022-04-10')
select id1 from A
where id1 not in (select id1 from B)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/474668.html
