1

MINUS演算子の 2 つのオペランドが2 回計算されるこのクエリがあります。一度だけ作成されるようにクエリを書き直すにはどうすればよいですか?

(目的は、2 つのセットが等しいことを確認することです)

SELECT DISTINCT t1.id
FROM t1
WHERE NOT EXISTS (SELECT t2.did FROM t1 AS t2
              WHERE t2.id = t1.id
              MINUS
              SELECT t3.did FROM t3
              WHERE t3.price > 500000)
AND NOT EXISTS (SELECT t3.did FROM t3
            WHERE t3.price > 500000
            MINUS
            SELECT t2.did FROM t1 AS t2
            WHERE t2.id = t1.id);

明確にするために、次の 2 つの [サブ] クエリがクエリで 2 回繰り返されます。

SELECT t2.did FROM t1 AS t2
WHERE t2.id = t1.id

SELECT t3.did FROM t3
WHERE t3.price > 500000
4

3 に答える 3

2
with
   ALL_DID as (
      select did from t3
      where price > 500000
   ),
   PAIRS as (
      select
         id, t3.did
      from t1
         left join ALL_DID t3
         on t1.did = t3.did
   )
select id from PAIRS
   group by id
   having count(did) = (
      select count(0) from ALL_DID
   )
minus
select id from PAIRS
   where did is null

フィドル

于 2013-03-16T07:07:33.930 に答える