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&C ではなく、A&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')
4

5 に答える 5

2

セットを比較する方法の 1 つは、グループの数を取得し、検索セットでグループをフィルター処理して、グループごとの一致数がグループ メンバーの元の数と等しいかどうかを確認することです。

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

試す:

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

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」が or なしで必要であることに気付きました。その場合:

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 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 に答える