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 に答える