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

Mic*_*l A 5 sql t-sql sql-server sql-server-2008

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

[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.*
Run Code Online (Sandbox Code Playgroud)

Zan*_*ien 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
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)

  • 将`SELECT*FROM lease_proposal INTERSECT`保留在查询之外会产生相同的结果.`INTERSECT`只是抑制了'building_id ='001'`的重复行,如果有的话.然后,您使用的是结果子集找到行的另一个条件不匹配它,而且,它不会意味着如果子集包含重复或不是因为你仍然会想的是*不*在子行. (2认同)