2012-07-05 104 views
5

我有一个表,可怕的设计(不是我做谢天谢地),在一个时装商店的数据类似以下内容:where table。* <> table。* - 有没有办法做这样的事情?

[关键],[lease_id],[building_name],约20个多列数据

lease_id可以和将存在的中心以及总部。我被要求找到所有的情况,其中一栋建筑物中的数据与同一租约的总部数据不匹配。

我可以很容易地做到这一点,自我加入。这里面临的挑战是有大约20列进行比较,尽管我可以手动输入每一列,但我想知道是否有更好的方法来做到这一点(这也意味着查询可以在将来使用,计算任何表变化)。

在syntaxtically荒谬的伪代码 - 我想做类似于下面会做,如果它是工作的内容:

select lp.* 
from lease_proposal lp 
     inner join 
     (
      select * 
      from lease_proposal lp2 
      where building_id = '001' -- assume 001 is head office for sake of example 
     ) lp2 
      on lp2.lease_id = lp.lease_id 
where lp.* <> lp2.* 

回答

5

你可以做一个INTERSECT操作寻找到所有的数据匹配的所有行,然后LEFT JOIN导致并仅选择其中有没有交集的行:

SELECT 
    a.* 
FROM 
    lease_proposal a 
LEFT JOIN 
    (
     SELECT * 
     FROM lease_proposal 

     INTERSECT 

     SELECT * 
     FROM lease_proposal 
     WHERE building_id = 001 
    ) b ON a.lease_id = b.lease_id 
WHERE 
    b.lease_id IS NULL 

如果SQL Server支持它,你也可以使用一个NATURAL LEFT JOIN像这样:

SELECT 
    a.* 
FROM 
    lease_proposal a 
NATURAL LEFT JOIN 
    (
     SELECT * 
     FROM lease_proposal 
     WHERE building_id = 001 
    ) b 
WHERE b.lease_id IS NULL 
+0

这是不可用的SQL Server,请参阅:http://stackoverflow.com/questions/4826613/natural-join-in-sql-server – Codingo

+0

这把我的知识了一个档次 - 真正伟大的职位, thank-you – Codingo

+2

将'SELECT * FROM lease_proposal INTERSECT'离开查询会产生相同的结果。如果有'BUILD_ID ='001'',INTERSECT'只会抑制重复的行。然后,您使用生成的子集在另一个条件中查找不匹配的行,并且它不表示子集是否包含重复项,因为您仍然希望行中的*不在子集中。 –

相关问题