2013-03-16 128 views
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 
+0

你可以張貼一些示例數據和預期的效果?不確定我們完全理解您的要求。 – sgeddes 2013-03-16 03:32:24

+0

我用兩次計算的兩個查詢更新了帖子。我在詢問如何在查詢中創建臨時表/關係,以便可以重用結果。 – 2013-03-16 03:41:28

回答

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 

fiddle

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 Fiddle Demo

+0

我在試圖簡化查詢的同時在問題中犯了一些錯誤。這是我最初想做的。這兩個表是't3:(price,did)' 't1:(did,id)' 查找所有價格大於500000的t3.did(稱爲此集合s1)。然後找到所有't1.id',這樣設置'select t1.did'等於's1' – 2013-03-16 04:05:07

+0

@OneTwoThree - 你可能最好發佈樣本數據和期望的結果(可能是SQL小提琴)。這聽起來像你只是想要一個INNER JOIN:SELECT t1.id FROM T1 JOIN T3 ON T1.did = T3.did AND T3.Price> 500000; – sgeddes 2013-03-16 04:10:34

+0

也許如果我把它翻譯成簡單的英文,它會更有意義。如果't1.id'是銷售由't1.did'標識的產品的人員的id,並且't3'是產品表(其中't3.did'是產品的id並且'price'是它的價格),那麼查詢將是'查找出售價格大於500000的所有產品的所有人的ID' – 2013-03-16 04:15:19

-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 
+0

不,因爲這意味着你會得到'id','did'的'price'大於500000這與問題中的查詢不同。 – 2013-03-16 04:17:57

+0

哦對不起,從我結束的錯字。最後一個連接子句是t1.id = t2.did – georgecj11 2013-03-16 04:25:02