2012-12-03 22 views
0
之間選擇

我有表SQL SELECT expression-與3個表

T1:

T1ID 

1000 
1001 
1002 
1003 

T2:

T2ID  T1ID 

W1  1000 
W2  1000 
W3  1001 
W4  1002 
W5  1003 

T3:

T3ID STATUS T2ID 

T1  CLOSE W1 
T2  CLOSE W1 
T3  INPRG W3 
T4  INPRG W3 
T5  CLOSE W5 
T6  INPRG W5 

我想使表達式從T1中僅得到1000和1002的結果。 由於來自T1的選擇,我希望獲得T2中具有T2記錄的記錄,其中所有T3記錄都處於CLOSE狀態,或者T2記錄根本沒有T3記錄。

因此,1000具有W1,其具有在CLOSE和W2中沒有T3記錄的所有T3記錄。 還有1002有沒有T3記錄的W4記錄。 所以他們必須被選中。

1001不能選擇,因爲它有W3記錄,所有T3記錄都沒有關閉。 1003也不能被選中,因爲它有W5,所有T3記錄都沒有關閉。

這對我來說有點棘手。

謝謝

+1

[你有什麼試過](http://whathaveyoutried.com)?你究竟在幹什麼?請發佈您當前的查詢。 – Oded

+1

請發佈您試過的查詢 –

+1

您正在使用哪些DBMS? PostgreSQL的?甲骨文? DB2? –

回答

0
Select distinct t1.id 
From t1 
     Inner join 
     T2 on t1.id=t2.t1id 
     Left join 
     (Select t3.t3id 
     from T3 
     where t3.status <> 'CLOSE') t3a on t3a.t3id=t2.t3id and t3.t3id is null 

寫在平板電腦,所以請原諒/更正大寫。

0

因此,您需要T1中的所有記錄,其中只有關閉T3記錄或沒有T3記錄,其中T3通過T2鏈接到T1。相反,您需要所有T1記錄,除非您有非關閉的T3記錄。

表達它的兩種方式給出了不同的方式來編寫相同的查詢。例如,你可以做

SELECT t1.id 
FROM t1 
where not exists(
    select * 
    from t2 
    inner join t3 
     on t2.id = t3.t2id 
    where t3.status <> 'CLOSE' 
) 

或者你可以做

select t1.id 
from t1 
EXCEPT 
select t1.id 
from t1 
    inner join t2 
    on t1.id = t2.t1id 
    inner join t3 
    on t2.id = t3.t2id 
where t3.status <> 'CLOSE' 

你可以問SQL Server Management Studio中告訴你,哪一個更有效率 - 他們很可能會結束與相同的查詢計劃執行。

(未測試,但我認爲上面的語法可以)