table。*<> table。* - 有没有办法做这样的事情?

时间:2012-07-05 04:44:27

标签: sql sql-server sql-server-2008 tsql

我有一张桌子,设计非常糟糕(不是我的谢天谢地),以类似于以下的方式存储数据:

  

[key],[lease_id],[building_name],~20多个数据列

对于中心和总部,可以并且将存在lease_id。我被要求查找所有实例,其中租赁建筑物中的数据与同一租约的总部数据不匹配。

我可以很容易地通过自我加入来做到这一点。这里的挑战是大约有20列要比较,虽然我可以手动输入每一列我想知道是否有更好的方法来做到这一点(这也意味着查询可以在将来使用,考虑到任何表格的变化)。

在语法上荒谬的伪代码 - 我想做一些类似于以下内容的工作:

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.*

1 个答案:

答案 0 :(得分: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
相关问题