1

我不知道这个问题以前是否也被问过。如果是这样,请引导我到链接。

我有一个包含三列的表nametype并且dateType只能是 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 有一个typeD,所以显示了 ABC 和 XYZ 的其他记录。由于 lmn 没有typeD 它不包含在结果集中。

4

3 回答 3

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"
);
于 2012-06-07T16:30:14.423 回答
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

于 2012-06-07T16:31:54.127 回答
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) 

您甚至可以这样做,而不是拥有该视图,而是将该查询放在“不在”之后的括号中

于 2012-06-07T16:31:08.763 回答