2012-07-25 131 views
1


假设我有一个名为“tblTemp”具有下列数据与多行条件SQL选择数据

ID  Name 
1   A 
2   B 
3   C 
4   A 
4   B 
5   A 
5   B 
5   C 
6   C 
6   B 

我想从& B的名义获得ID,但跟&乙表&ç象下面这样:

4   A 

4   B 

我该如何在sql中这样做?

我尝试以下SQL,但它返回5行,以及:

SELECT  tblTemp.ID, tblTemp.Name 
FROM   tblTemp INNER JOIN 
        tblTemp AS tbltemp_1 ON tblTemp.ID = tbltemp_1.ID 
WHERE  (tblTemp.Name = 'A') AND (tbltemp_1.Name = 'B') 
+2

问题标记为[tag:mysql]和[tag:sql-server]。你在用哪个? – eggyal 2012-07-25 10:57:18

+0

对于所有那些,OP要ID和A,B,如果它也有C,它应该被省略 – Madhivanan 2012-07-25 11:02:24

+0

@Madhivanan我相信OP想精确设置比较... – 2012-07-25 11:08:30

回答

0

你只是想有A或B,但不是C不同ID的列表?我上面的解决方案适用于'A'和/或'B',但我注意到你实际上想要'A'和'B'没有或。在这种情况下:

SELECT distinct ID 
FROM tblTemp as T1 
INNER JOIN tblTemp as T2 
ON T1.ID = T2.ID 
WHERE T1.Name = 'A' and T2.Name = 'B' 

EXCEPT 

SELECT distinct ID 
FROM tblTemp 
WHERE Name = 'C' 

这是你的原码的延伸,也许并不像@ Madhivanan的解决方案,优雅,但它是更普遍的应该在B和C的变化,例如字。

+0

否它会包含ID可能有名称' C' – Madhivanan 2012-07-25 10:55:36

+0

会吗?除外条款不包括名称= C的集合,所以应该没有剩下。我相当确信这是有效的。 – Dan 2012-07-25 11:09:32

+0

哦,你用EXCEPT,那么它会工作我误解为UNION :) – Madhivanan 2012-07-25 11:15:14

0

尝试:

SELECT distinct ID 
FROM tblTemp a 
    LEFT JOIN tblTemp b 
      ON a.ID = b.ID AND 
       b.name = 'C' 
WHERE b.ID IS NULL; 
0
select id from table 
group by id 
having min(Name)='A' and max(Nmae)='B' 
0
SELECT ID, Name FROM tblTemp WHERE (Name = 'A' OR Name = 'B') and ID not in(SELECT ID FROM tblTemp WHERE Name = 'C') 
2

一个比较套的方式是采取组由搜索集计数,过滤器组,看看每组比赛的数量等于原组成员数量:

select tblTemp.ID 
    from tblTemp 
inner join 
(
    select ID, 
      count(*) GroupCount 
    from tblTemp 
    group by ID 
    having count(*) = 2 
) g 
    on tblTemp.ID = g.ID 
where tblTemp.Name in ('A', 'B') 
group by tblTemp.Id, g.GroupCount 
having count (*) = g.GroupCount 

这应该对MySql和Sql Server都有效。

You can play with this code @ Sql Fiddle

+0

感谢尼古拉这个解决方案。它按我的预期工作。 – Pengan 2012-07-26 04:07:41

+0

不客气:-) – 2012-07-26 06:02:01