我有一张桌子,设计非常糟糕(不是我的谢天谢地),以类似于以下的方式存储数据:
[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.*
答案 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