假设我有两个表(来自上传的 csv 文件),我想根据新文件中的 id+territory 进行差异分析,而旧文件中没有。最简单的方法是:
SELECT id, territory FROM this_week EXCEPT SELECT id, territory FROM last_week
但是,我试图获取由该差异生成的所有字段(在两个表中 - 每个键一行)。如何做到这一点?
postgres 或 bigquery 都可以。两者都有EXCEPT
set op。
来自 Erwin 答案的数据示例:
WITH this_week (id,territory,name,other) AS (VALUES(1,'us','titanic','uhd'),(22,'us','spider','hd'),(3,'fr','new','hd')),
last_week (id,territory,name,other) AS (VALUES(1,'us','titanic','uhd'),(2,'us','spider','hd'))
SELECT * -- all columns of "this_week"
FROM this_week t
WHERE NOT EXISTS (
SELECT * FROM last_week l
WHERE t.id = l.id
AND t.territory = l.territory
);
使用
NOT EXISTS
:并且索引
last_week (id, territory)
通常会对性能有很大帮助。这将显示的所有列
this_week
。我认为没有必要添加 的列,因为根据查询的定义,如果您使用左连接,
last_week
这些列将为空 ( )。null
基础知识:
请注意细微的差别:
EXCEPT
(不带 时使用ALL
)折叠重复项。此查询不折叠重复项。您可能需要其中一个。通常,您需要这个。比较两个结构相同的表(相同序数位置上的相同列名),且具有主键(唯一且不可空)pk:
这将显示两个表之间的所有差异。如果两个表中都有匹配的 pk,您将看到其余列在某些地方不同的记录。如果某行在 t1 中而不在 t2 中(按 pk),它将出现;如果某行在 t2 中而不在 t1 中(按 pk),它将出现。
如果表的结构不相同,则需要扩展子查询中的 *,并明确列出要比较的列。
一个例子
Db<>摆弄示例