基本上我们有一个table(original table),它被备份到另一个table(backup table); 因此这两个表具有完全相同的模式.
在开始时,两个表(original table和backup table)包含完全相同的数据集.由于某种原因,我需要验证数据集是否original table已更改.
为了做到这一点,我必须将数据集进行比较的original table反对backup table.
假设它original table具有以下模式:
create table LemmasMapping (
lemma1 int,
lemma2 int,
index ix_lemma1 using btree (lemma1),
index ix_lemma2 using btree (lemma2)
)
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现数据集比较?
更新:表没有主键.它只是存储两个ID之间的映射.
Jos*_*vis 33
您可以使用CHECKSUM TABLE并比较结果.您甚至可以更改表以启用实时校验和,以便它们可以持续可用.
CHECKSUM TABLE original_table, backup_table;
Run Code Online (Sandbox Code Playgroud)
它不要求表具有主键.
小智 20
SELECT * FROM Table1
UNION
SELECT * FROM Table2
Run Code Online (Sandbox Code Playgroud)
如果您获得的记录大于两个表中的任何一个,则它们没有相同的数据.
Mik*_*son 16
我会写三个查询.
一个内部联接,用于获取两个表中存在主键的行,但其中一个或多个列的值存在差异.这会拾取原始的更改行.
左外连接用于拾取原始表中的行,但不在备份表中(即原始行中的行具有备份中不存在的主键).这将返回插入原始行的行.
右外连接用于拾取原始中不再存在的备份行.这将返回已从原始文件中删除的行.
您可以将三个查询组合在一起以返回单个结果集.如果您这样做,则需要添加一列来指示它的行类型(更新,插入或删除).
通过一些努力,您可以使用完全外部联接在一个查询中执行此操作.注意外连接,因为它们在不同的SQL引擎中表现不同.放在where子句中的谓词,而不是join子句有时可以将外连接转换为内连接.
大多数 DBMS 支持关系代数的 DIFFERENCE 运算。在 Snowflake 中,它表示为 MINUS。所以下面的代码可以工作。第一个 MINUS 确保 Table1 中的每个元素也在 Table2 中。第二个 MINUS 确保 Table2 中的每个元素也在 Table1 中。如果查询返回零,从数学上讲,这两个表完全相同。
select count(*) from
(
(
SELECT * FROM Table1
MINUS
SELECT * FROM Table2
)
UNION ALL
(
SELECT * FROM Table2
MINUS
SELECT * FROM Table1
)
)
Run Code Online (Sandbox Code Playgroud)