sql查询以返回两个表之间的差异

19 浏览
0 Comments

sql查询以返回两个表之间的差异

我正在尝试比较两个表,SQL Server,以验证一些数据。我想返回两个表中数据存在于其中一个的所有行。实际上,我想显示所有的差异。我需要检查三个数据片段,即名字、姓氏和产品。

我对SQL还不太熟悉,似乎很多解决方案都过于复杂化。我不需要担心NULL值。

我开始尝试像这样的查询:

SELECT DISTINCT [名字], [姓氏], [产品名称] FROM [临时测试数据]
WHERE ([名字] NOT IN (SELECT [名字] 
FROM [真实数据]))

但是我在进一步处理时遇到了麻烦。

谢谢!

编辑:

根据@treaschf的答案,我一直在尝试使用以下查询的变化:

SELECT td.[名字], td.[姓氏], td.[产品名称]
FROM [临时测试数据] td FULL OUTER JOIN [数据] AS d 
ON td.[名字] = d.[名字] AND td.[姓氏] = d.[姓氏] 
WHERE (d.[名字] = NULL) AND (d.[姓氏] = NULL)

但是,当我知道td中至少有1行不在d中时,我始终得到0个结果。

编辑:

好吧,我想我找到了解决办法。至少在我几分钟的测试中,它似乎运行得足够好。

SELECT [名字], [姓氏]
FROM [临时测试数据] AS td
WHERE (NOT EXISTS
        (SELECT [名字], [姓氏]
         FROM [数据] AS d
         WHERE ([名字] = td.[名字]) OR ([姓氏] = td.[姓氏])))

这基本上会告诉我在我的测试数据中存在而在真实数据中不存在的内容。对于我需要做的事情来说,这已经足够了。

0
0 Comments

问题的出现原因是当需要比较两个表之间的差异时,使用传统的SQL查询语句会变得复杂和繁琐。尤其是在引入更多的列、在两个服务器上使用不同数据库、以及需要进行更复杂的比较条件等情况下,使用SQL查询语句会变得更加困难。

为了解决这个问题,可以使用第三方工具来进行表之间的差异比较。这些工具包括ApexSQL Data Diff、Quest Toad等,可以在试用模式下使用这些工具完成工作。此外,还有一个名为Diffkit的开源数据库通用解决方案,可以与各种数据库或文件系统的表形式数据一起使用。

此外,微软也提供了一个名为`tablediff`的SQL Server命令行实用工具,可以用来比较表之间的差异。具体信息可以在这里找到。

总之,为了更方便地比较两个表之间的差异,可以使用第三方工具或者微软提供的命令行实用工具,避免使用复杂的SQL查询语句。

0
0 Comments

问题的原因是需要找到两个表之间的差异,即在表A中存在但在表B中不存在的记录。解决方法是使用SQL语句进行连接和比较操作。

首先,可以使用LEFT JOIN和IS NULL来找到在表A中存在但在表B中不存在的记录,SQL语句如下:

SELECT A.*
FROM A
LEFT JOIN B ON (A.C = B.C)
WHERE B.C IS NULL

这段代码会返回在表A中存在但在表B中不存在的记录。

然后,如果想要一次性找到两个表之间的所有差异,可以使用FULL JOIN,SQL语句如下:

SELECT A.*, B.*
FROM A
FULL JOIN B ON (A.C = B.C)
WHERE A.C IS NULL OR B.C IS NULL

这段代码会返回在表A和表B之间存在差异的所有记录,包括在表A中存在但在表B中不存在的记录以及在表B中存在但在表A中不存在的记录。如果一条记录在表A中存在但在表B中不存在,那么来自表B的列将为NULL;反之,如果一条记录在表B中存在但在表A中不存在,那么来自表A的列将为NULL。

在使用这些代码时,需要注意当比较一个值和NULL时,不能使用'='运算符,而应该使用'IS NULL'或'IS NOT NULL'。另外,如果在FROM子句中存在相同的表名,可以使用别名来区分它们。

通过使用以上的SQL语句和技巧,可以方便地找到两个表之间的差异,并进行进一步的操作。

0
0 Comments

问题出现的原因是使用上述SQL查询时出现错误。这个错误是由于使用了UNION操作符的两个查询的目标列表中表达式数量不相等导致的。解决方法是确保选择相同的字段(相同的类型)并按相同的顺序选择。如果所有列都是如此,SELECT *将适用;否则,只需选择一些子集。

此外,还有一些其他的讨论和解决方法。一位用户询问了这个解决方案对于包含50万行或5000万行的大型数据集是否有效。另一位用户回答说,在Oracle中可以使用MINUS操作符,并且比左外连接变体更高效。还有用户提到他们使用了不同的服务器作为测试环境,对于在两个不同的服务器上进行并行测试的情况,他们提供了另外的帮助链接。

还有一位用户询问如何添加一个字段来告诉他返回的记录来自哪个表。有其他用户提供了解决方法,通过在查询中添加一个额外的列来指示源表的名称。

最后,还有用户提醒要小心,这个解决方案会丢弃重复的记录。如果查询没有返回结果,并且是因为存在重复记录,可以使用GROUP BY所有列并且HAVING COUNT(*) > 1来查找新增的记录。

最后还有用户提到在BigQuery中这个解决方案不起作用,并给出了修改的建议。在BigQuery中,只支持EXCEPT DISTINCT,不支持EXCEPT ALL。建议修改查询,添加一个额外的列来指示来源表。

通过对用户讨论和解决方法的整理,我们了解到了"sql query to return differences between two tables"这个问题的出现原因以及解决方法。

0