如何组合两个查询还是只有一个?

How do combine two Queries or is it only one?

问题:

如何合并两个查询还是只有一个?

示例:

我的 PostgreSQL 数据库有两个完全相似的表。 info_tableinfo_table_dump 具有完全相同的列 date_atnamecolorlength。现在我想知道 info_table_dump 中是否存在 info_table 中不存在的条目。因此我做了这些查询:

SELECT
date_at,name,color,length
FROM
info_table_dump
EXCEPT
SELECT
date_at,name,color,length
FROM
info_table;

结果很好。它像我假设的那样工作(我创建了 2 个不匹配的条目)显示了 none-重复项。但现在我只想获取非重复行的给定 ids。像这样...

SELECT
id
FROM
info_table_dump
WHERE
(SELECT
date_at,name,color,length
FROM
info_table_dump
EXCEPT
SELECT
date_at,name,color,length
FROM
info_table);

我也用 EXISTS 尝试过一些,但不是我想要的结果。

所以我的问题是如何组合查询?

我只想要 info_table_dump 行的 ìd,它们不存在于 info_table

所以它们不应该存在于 info_table 中?

SELECT id
FROM info_table_dump d
WHERE NOT EXISTS (
  SELECT 1
  FROM info_table i
  WHERE i.date_at IS NOT DISTINCT FROM d.date_at
    AND i.name IS NOT DISTINCT FROM d.name
    AND i.color IS NOT DISTINCT FROM d.color
    AND i.length IS NOT DISTINCT FROM d.length
);

IS NOT DISTINCT FROM 是为了防止某些列可以为空。

更传统的 old-school 方法是左连接并过滤不匹配的。哪个实际上可能有更好的性能。

SELECT d.id
FROM info_table_dump d
LEFT JOIN info_table i
  ON i.date_at IS NOT DISTINCT FROM d.date_at
 AND i.name IS NOT DISTINCT FROM d.name
 AND i.color IS NOT DISTINCT FROM d.color
 AND i.length IS NOT DISTINCT FROM d.length
WHERE i.id IS NULL;

db<>fiddle here

上测试