5

我有一个设计糟糕的表(谢天谢地不是我做的),它以类似于以下方式存储数据:

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

1 回答 1

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
于 2012-07-05T04:56:13.253 回答