比较具有相同列名但不同日期列名的两个表
compare two tables having same column name but different date column names
我有table个
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
Table 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 具有日期值但列名不同('dt' 代表 Table A,'date' 代表 table B)
期望的输出:
id1
DATE
x1
2022-04-10
a2
2022-04-10
x2
2022-04-10
更新 1:
笔记:
1)y2,a1 不在 Desired 输出中,因为它们同时存在于 tables
2)c3 不在期望的输出中,因为它存在于 Table B
id1 存在于两个 table 中,但我只希望 Table A 中的“id1”值在 2022 年的日期不在 Table B 中-04-10.
到目前为止采取的步骤:
select id1 from A where dt="2022-04-10" EXCEPT select id1 from B
结果(它的 运行 很长一段时间并超时,不确定它是因为数据量还是查询错误)将检查较小的 tables.
我无法使用 Left Inner Join,因为日期列不同(date 与 dt)。
如有任何帮助,我们将不胜感激。
我不完全确定你的输出。但我想你想要这样的东西:
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
您可以通过在左连接和右连接 table 之间应用 UNION
语句来实现。从这些连接中,您的目标是那些由于不匹配而第二个 table 值为 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 here.
编辑
只想要来自 table 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'
仅来自 table 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'
这也有效
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)
我有table个
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 |
Table 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 具有日期值但列名不同('dt' 代表 Table A,'date' 代表 table B)
期望的输出:
id1 | DATE |
---|---|
x1 | 2022-04-10 |
a2 | 2022-04-10 |
x2 | 2022-04-10 |
更新 1: 笔记: 1)y2,a1 不在 Desired 输出中,因为它们同时存在于 tables 2)c3 不在期望的输出中,因为它存在于 Table B
id1 存在于两个 table 中,但我只希望 Table A 中的“id1”值在 2022 年的日期不在 Table B 中-04-10.
到目前为止采取的步骤:
select id1 from A where dt="2022-04-10" EXCEPT select id1 from B
结果(它的 运行 很长一段时间并超时,不确定它是因为数据量还是查询错误)将检查较小的 tables.
我无法使用 Left Inner Join,因为日期列不同(date 与 dt)。
如有任何帮助,我们将不胜感激。
我不完全确定你的输出。但我想你想要这样的东西:
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
您可以通过在左连接和右连接 table 之间应用 UNION
语句来实现。从这些连接中,您的目标是那些由于不匹配而第二个 table 值为 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 here.
编辑
只想要来自 table 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'
仅来自 table 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'
这也有效
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)