比较具有相同列名但不同日期列名的两个表

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)