2012-06-07 57 views
1

我不知道以前是否也詢問過此問題。如果是這樣,請將我引導至鏈接。用於檢索列中具有條件值的行的SQL查詢

我有一個表有三列name,typedateType只能是4個值A,B,C和D

我想獲取所有那些類型爲A,B或C的記錄,但條件是隻有在相同名稱也具有類型的D.

例如讓我們考慮這個表

Name  type Date 
abc  A  5/7 
abc  B  6/7 
abc  D  7/7 

xyz  A  5/7 
xyz  D  6/7 

lmn  A  5/7 
lmn  B  6/7 
lmn  C  7/7 

所以這裏的交易,我需要以下結果集

ABC 5/7 
ABC 6/7 
XYZ 5/7 

因爲ABC和XYZ有type d ABC和XYZ的其他記錄中顯示。由於lmn沒有type D,因此它不包含在結果集中。

回答

3

測試如果記錄存在,你可以簡單地使用where exists

select * from mytable t1 where exists (
    select * from mytable t2 where t1.Name=t2.Name and t2.type="D" 
); 

這可能是自我解釋,但這裏有一個參考:http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

如果你想排除d記錄,你這樣做:

select * from mytable t1 where t1.type<>"D" and exists (
    select * from mytable t2 where t1.Name=t2.Name and t2.type="D" 
); 
+1

我相信這將返回3 ABC記錄和2記錄XYZ。 –

+0

我重讀了這個要求,你說得對。我通過添加第二個查詢來編輯我的答案,這是一個小調整。 –

0
create view all_D as select name from your_table where type=D 
select * from your_table where type<>D and name in (select * from all_D) 

你甚至可以使這樣的塔t鍵具有鑑於您突出部分放在括號中查詢後「不」

1

試試這個:

SELECT Name, Date 
FROM MyTable as mt 
WHERE type != 'D' 
AND EXISTS 
(
    SELECT * FROM MyTable as mt2 
    WHERE mt2.type = 'D' and mt2.name = mt.name 
) 

您選擇所有記錄類型不等於D並有記錄與一個匹配的名稱,其中類型IS等於D