2013-08-30 60 views
0

好吧,標題是相當混亂,所以讓我解釋一個例子。選擇值,而不是從一列中選擇值,併合並結果

我的表:

id ref valid 
--------------- 
1 PRO true 
1 OTH true 
2 PRO true 
2 OTH false 
3 PRO true 
4 OTH true 

這裏的主鍵是ID和REF的組合。

我想選擇所有具有有效的「PRO」ref和另一個有效的ref的意思,在這種情況下,它只會返回我「1」。 我不明白我如何做到這一點,IN和SELF JOIN似乎不適合這個。

+0

PRO必須是有效的嗎?或者它可能是假的? – fthiella

+0

是的,PRO也必須是有效的(編輯問題) – Willy

回答

3

這裏有一種方法,使用EXISTS

SELECT id 
FROM Table1 a 
WHERE ref = 'PRO' 
AND EXISTS 
(
    SELECT 1 
    FROM Table1 b 
    WHERE b.id = a.id 
    AND b.ref <> 'PRO' 
    AND b.valid = 'true' 
) 
+0

太棒了!爲什麼你必須加入「ID」? – Willy

+0

因爲否則如果有任何id的有效行,EXISTS查詢將返回true,而不僅僅是有關行 –

0

使用join

SELECT t1.id 
FROM Table1 t1 join Table1 t2 on 
t1.id = t2.id and t1.ref = 'PRO' and t2.ref <> 'PRO' 
       and t1.valid= 'true' and t2.valid= 'true' 
0

SELECT ID FROM表1一 內加入(選擇ID,COUNT(*)FROM表1組由數id)temp temp on temp.id = a.id and count> 1 其中a.ref ='PRO'

0

這是我的解決方案:

SELECT id 
FROM  val 
WHERE valid='true' 
GROUP BY id 
HAVING 
    COUNT(DISTINCT ref)>1 
    AND COUNT(CASE WHEN ref='PRO' THEN ref END)>0 

請參閱小提琴here

0

可以使用內自聯接,嵌套查詢和位分組的解決它:

SELECT A.* 
FROM (
    SELECT id 
    FROM test 
    WHERE (ref = 'PRO') AND (valid = 'true') 
) AS A 
INNER JOIN (
    SELECT id 
    FROM test 
    WHERE valid = 'true' 
    GROUP BY id 
    HAVING (
    count(DISTINCT ref) >1 
    ) 
) AS B 
ON A.id = B.id 

的子查詢查詢表與「PRO」 REF時,B組的ID和查詢表對於至少有兩位裁判的裁判有效爲真。

相關問題