sql组合多个运营商
问题描述:
我有一个查询,我在MS-SQL中编写,必须检查,以查看有关客户端的信息是否已经在表中插入之前。如果一个实体已经改变,那么该行将被插入。问题是我可以在where子句中结合运算符吗?现在我有一个查询,看起来像这样:sql组合多个运营商
select * from @Temp c
where exists (select * from Clients c2
where (c.ClientId = c2.ClientId and c.ClientFName <> c2.FirstName)
or (c.ClientId = c2.ClientId and c.ClientLName <> c2.LastName)
or (c.ClientId = c2.ClientId and c.ClientAddress <> c2.Address)
or (c.ClientId = c2.ClientId and c.ClientCity <> c2.City)
or (c.ClientId = c2.ClientId and c.ClientState <> c2.State)
or (c.ClientId = c2.ClientId and c.ClientZip <> c2.Zip)
有什么优势或劣势编写这样的查询:
select * from @Temp c
where exists (select * from Clients c2
where (c.ClientId = c2.ClientId
and (c.ClientFName <> c2.FirstName
or c.ClientLName <> c2.LastName
or c.ClientAddress <> c2.Address
or c.ClientCity <> c2.City
or c.ClientState <> c2.State
or c.ClientZip <> c2.Zip)))
对我来说,这两个查询工作,但什么是最好的方式写这个?
答
任何时候你可以消除冗余,这是一件好事。第二种方式获胜。 :)
顺便说一句,让我们回答一个更好的问题,你没有问,假设@temp
从Clients
加载,以便您可以找到有问题的记录。你可以这样做:
SELECT * FROM Clients
WHERE clientid in (
SELECT clientid from (select distinct * from Clients) t
GROUP BY clientid HAVING count(*) > 1)
(这也消除了null
小号比较混乱)
答
我不太知道确切的问题是在这里。但是,两者看起来都很好 - 我更喜欢第二个从可读性的角度来看,但是这是偏好。
表现明智,我不认为你会注意到一个区别。
答
实际上,如果您查看这两个查询的查询计划,您可能会发现优化程序将它们还原为相同的事物。如果没有,那么你会选择提供最佳性能的版本(查询计划),但这两者是等价的,优化器可能会注意到并利用它。
我注意到,如果任何列允许空值,那么该列的比较是不充分的。你需要更类似的东西:
OR c1.ClientAddress <> c2.ClientAddress
OR (c1.ClientAddress IS NULL AND c2.clientAddress IS NOT NULL)
OR (c1.ClientAddress IS NOT NULL AND c2.clientAddress IS NULL)