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)
您可以执行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)
| 归档时间: |
|
| 查看次数: |
696 次 |
| 最近记录: |