1

我有这个查询,其中运算符的两个操作数MINUS被计算了两次。如何重写查询以便它们只创建一次?

(目的是检查两组是否相等)

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);

为了澄清事情,以下两个 [子] 查询在查询中重复了两次:

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 回答
0

如果您只想能够多次重用相同的查询,请考虑使用公用表表达式。或者您可以考虑创建视图。您可以通过这些方式快速“重用”相同的查询。

但是,我仍然不完全了解您想要的结果是什么。您是否想根据 did/eid 字段了解 t1 中的数据是否与 t3 中的数据相同?如果是这种情况,您似乎可以使用 LEFT JOIN 更轻松地解决这个问题。像这样的东西:

SELECT DISTINCT t1.id
FROM t1 
  LEFT JOIN t3 ON t1.did = t3.did AND t3.price > 500000
WHERE t3.id IS NULL

这将告诉您 t1 中是否有任何不在 t3 中的记录(具有相同的做和价格 > 500000)。

编辑——要查找所有销售价格大于 500000 的产品的所有人的 id,那么这应该有效:

SELECT t1.id, COUNT(DISTINCT t1.did) productcnt
FROM t1
  JOIN t3 ON t1.did = t3.did
WHERE t3.Price > 500000
GROUP BY t1.id
HAVING COUNT(DISTINCT t1.did) = (
  SELECT COUNT(DISTINCT did) cnt
  FROM t3
  WHERE Price > 500000 )

SQL 小提琴演示

于 2013-03-16T03:50:45.643 回答
-1

这不是正常的内部连接查询吗?

SELECT t2.* 
from t1
INNER JOIN t3 as t3 on t1.did = t3.tid
INNER JOIN t1 as t2 on t2.did = t1.id
WHERE t3.price > 50000
于 2013-03-16T04:14:42.477 回答