我想查询我们的CRM Db
. 我有一个备份CRM Db
和现有的。有一个custom entity
,在他们两个我都创建了。我的一些自定义实体记录已从现有数据库中删除。我想比较哪些记录已删除。现有记录数为 17,备份包含 19 条记录。自定义实体名为new_services
。备份数据库被命名test2
,现有一个是MSCRM
表名是new_services
当我查询这个相等的时:
select * from test2.dbo.new_services as t1,
MSCRM.dbo.new_services as t2
where t1.new_service_Id = t2.new_service_Id;
并返回正确的记录,但是当我尝试这个时:
select * from test2.dbo.new_services as t1,
MSCRM.dbo.new_services as t2
where t1.new_service_Id != t2.new_service_Id;
它返回 308 records
!new_service_id 是记录的 guid。哪里错了?
您的逻辑是错误的;-) 假设有两个表:
您的第一个示例将返回 1 行:
而您的第二个示例将返回 4*4 - 1 = 15 行。如果您考虑一下,在一组 4x4=16 行中,其中 1 行谓词为真,如果谓词为假,则有多少行?
您可能正在寻找的是 MINUS 或 EXCEPT(不确定它在 sql-server 中的名称):
或者可能反过来(不确定哪个表是哪个)
编辑:正如评论中指出的 MySQL(不确定最新版本),不支持基本的集合操作 INTERSECT 和 EXCEPT。EXCEPT 是 SET MINUS,可以使用 NOT EXISTS 或 NOT IN 来实现:
另一种选择是使用 OUTER JOIN。
值得注意的是,
EXCEPT ALL
由于保留了 T1 中的任何重复项,因此上述对应。对于真正的EXCEPT
运算符,应使用 DISTINCT:我不会深入研究 null 的阴影地带,以及它对表达式之间逻辑相等的影响
另一方面,INTERSECT 与乘法密切相关。我们可以以与上述相同的方式使用 IN 或 EXISTS 谓词来模拟它。