1


假设我有一个名为“tblTemp”的表,其中包含以下数据

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

我想从 A&B 的名称中获取 ID,而不是 A&B&C,如下所示:

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')
4

5 回答 5

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。

您可以使用此代码@Sql Fiddle

于 2012-07-25T12:35:17.763 回答
0

您是否只想要具有 A 或 B 但没有 C 的不同 ID 的列表?

SELECT distinct ID
FROM tblTemp
WHERE Name = 'A' or Name = 'B'

EXCEPT

SELECT distinct ID
FROM tblTemp
WHERE Name = 'C'

我的上述解决方案适用于“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 的解决方案那么优雅,但如果 AB 和 C 更改为例如单词,它会更通用。

于 2012-07-25T10:46:43.557 回答
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;
于 2012-07-25T10:54:05.910 回答
0
select id from table
group by id
having min(Name)='A' and max(Nmae)='B'
于 2012-07-25T10:54:36.550 回答
0
 SELECT ID, Name FROM tblTemp WHERE (Name = 'A' OR Name = 'B') and ID not in(SELECT ID FROM tblTemp WHERE Name = 'C') 
于 2012-07-25T10:55:23.867 回答