【发布时间】:2016-11-25 12:53:11
【问题描述】:
我需要比较两个表数据并检查哪些属性不匹配,表具有相同的表定义,但问题是我有一个唯一的键来比较。我尝试使用
CONCAT(CONCAT(CONCAT(table1.A, Table1.B))
=CONCAT(CONCAT(CONCAT(table2.A, Table2.B))
但仍然面临重复的行也尝试了 NVL 在几列上但没有工作
SELECT
UT.cat,
PD.cat
FROM
EM UT, EM_63 PD
WHERE
NVL(UT.cat, 1) = NVL(PD.cat, 1) AND
NVL(UT.AT_NUMBER, 1) = NVL(PD.AT_NUMBER, 1) AND
NVL(UT.OFFSET, 1) = NVL(PD.OFFSET, 1) AND
NVL(UT.PROD, 1) = NVL(PD.PROD, 1)
;
一个表有 34k 条记录,另一个表有 35k 条记录,但是如果我运行上面的查询,行数是 300 万。
表格中的列:
COUNTRY
CATEGORY
TYPE
DESCRIPTION
样本数据:
表 1:
COUNTRY CATEGORY TYPE DESCRIPTION
US C T1 In
IN A T2 OUT
B C T2 IN
Y C T1 INOUT
表2:
COUNTRY CATEGORY TYPE DESCRIPTION
US C T2 In
IN B T2 Out
Q C T2 IN
预期输出:
column Matched unmatched
COUNTRY 2 1
CATEGORY 2 1
TYPE 2 1
DESCRIPTION 3 0
【问题讨论】:
-
添加一些示例表数据和预期结果。 (以及格式化文本。)
-
为什么要三重连接?
-
请更新您添加数据样本的问题和预期结果
-
你可以使用这套:
(A-B) U (B-A)=(select * from A minus select * from B) union (select * from B minus select * from A) -
@Varoo - 虽然 Cunning 的建议不会给你最有效的执行,但它们应该会给你正确的结果。您所说的“重复行”是什么意思 - UNION、INTERSECT 和 MINUS 消除了重复,因此您一定是错误地使用了“重复”这个词,或者您没有正确实施建议。