我正在设计一个动态SQL查询,它将针对目标表检查源表。我想比较源的行与目标的行,以检查差异。
CREATE TABLE TABLE_A (KEY INT, COL1 INT, COL2 INT)
CREATE TABLE TABLE_B (KEY INT, COL1 INT, COL2 INT)
所以我创建了这个声明:
SELECT A.* FROM TABLE_A A
INNER JOIN TABLE_B B
ON B.KEY = A.KEY
AND (B.COL1<>A.COL1 OR B.COL2<>A.COL2)
但只有col1和col2的值不为空时,这才有效。 如果table-a col1为null且table-b col1为null,那么我认为它们相等。
我知道我可以在我的列周围添加一个ISNULL,但这是一个正在构建的动态查询,因此我只知道列名而不是数据类型。
有什么建议吗?
答案 0 :(得分:9)
您可以使用this approach
SELECT A.*
FROM TABLE_A A
INNER JOIN TABLE_B B
ON B.KEY = A.KEY
WHERE NOT EXISTS (SELECT A.*
INTERSECT
SELECT B.* )
答案 1 :(得分:2)
IS NULL怎么样?
编辑:更新了查询以解释bot h列为空...变得冗长而丑陋,但正在工作......
SELECT A.* FROM TABLE_A A
INNER JOIN TABLE_B B
ON B.KEY = A.KEY
AND ((B.COL1<>A.COL1 OR (A.COL1 IS NULL AND B.col1 IS NOT NULL) OR (B.COL1 IS NULL AND A.col1 IS NOT NULL ))
OR (B.COL2<>A.COL2 OR (A.COL2 IS NULL AND B.col2 IS NOT NULL) OR (B.COL2 IS NULL AND A.col2 IS NOT NULL )))
答案 2 :(得分:0)
如果TABLE_A和TABLE_B具有相同的列。你可以试试这个
SELECT * FROM TABLE_A
EXCEPT
SELECT * FROM TABLE_B