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))) 

对我来说,这两个查询工作,但什么是最好的方式写这个?

任何时候你可以消除冗余,这是一件好事。第二种方式获胜。 :)

顺便说一句,让我们回答一个更好的问题,你没有问,假设@tempClients加载,以便您可以找到有问题的记录。你可以这样做:

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)