如何组合两个查询还是只有一个?
How do combine two Queries or is it only one?
问题:
如何合并两个查询还是只有一个?
示例:
我的 PostgreSQL 数据库有两个完全相似的表。 info_table
和 info_table_dump
具有完全相同的列 date_at
、name
、color
和 length
。现在我想知道 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-重复项。但现在我只想获取非重复行的给定 id
s。像这样...
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
上测试
问题:
如何合并两个查询还是只有一个?
示例:
我的 PostgreSQL 数据库有两个完全相似的表。 info_table
和 info_table_dump
具有完全相同的列 date_at
、name
、color
和 length
。现在我想知道 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-重复项。但现在我只想获取非重复行的给定 id
s。像这样...
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
上测试