2012-06-07 26 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