1

ここで SQL の達人の助けが必要です...

次の形式のデータがあります。

Key  Value
100  A
100  B
300  A
400  B
500  A
500  B
500  C
600  B
600  W

A または B と A と B を含むすべてのキーを検索したいが、AB 以外のキーを検索したくない場合はどうすればよいですか? 一時テーブルが必要ですか、それともテーブルをそれ自体に結合できますか?

編集: 必要な出力は、A と B があるためキー 100、A があるためキー 300、B があるためキー 400 です。C も含まれているためキー 500 ではなく、W も含まれているためキー 600 ではありません。

4

2 に答える 2

1

これはあなたのために働くはずです:

SELECT DISTINCT t1.`key`
FROM table1 t1
WHERE t1.value in('A', 'B')
GROUP BY t1.`key`
HAVING COUNT(t1.value) = (SELECT COUNT(t2.value) 
                          FROM Table1 t2 
                          WHERE t1.`key` = t2.`key`)

SQL フィドルのデモ

これはキーのみを返します。

  • 持っAているBだけで、他に何もkey = 500ないので、返されるべきではありません。しかしkey = 100、含まれている必要があります。
  • のみを持っていAます。のようにkey = 300
  • has only Bsoは、 which iskey = 600よりも 1 つ多い値が含まれているため、返されるべきではありません。しかし、含まれている必要があります。Bwkey = 400

更新:これはどのように機能していますか

キーに値がある場合IN('A', 'B')、他の値も含まれる可能性があります。

HAVINGそのため、次の句を追加しました。

HAVING COUNT(t1.value) = (SELECT COUNT(t2.value) 
                          FROM Table1 t2 
                          WHERE t1.`key` = t2.`key`)

各値について、相関サブクエリを使用して、同じキーの値COUNT(t1.value)の合計と比較されます。したがって、現在のキーにそれ以外の値が含まれている場合、 は同じキーのすべての値と等しくなりません。たとえば、キー = 500 にはカウント = 3 がありますが、次を使用します。COUNTSELECT COUNT(t2.value) FROM Table1 t2 WHERE t1.key = t2.keyt1.value'A', 'B'COUNT(t1.value)COUNT

SELECT DISTINCT t1.`key`
FROM table1 t1
WHERE t1.value in('A', 'B')
GROUP BY t1.`key`

どちらかまたは「B」があるため、節がないHAVING場合も含まれます。A'しかし、HAVINGcount = 3 が 2 と等しくないため、句はこのキーを削除します。

于 2012-11-07T14:01:55.883 に答える
0

あなたの質問をよりよく説明する必要があります。必要なものを正しく理解できれば、次のようなものを使用できます。

SELECT Distinct K
FROM tab
WHERE
  value IN ('A', 'B') AND
  NOT EXISTS (SELECT Null from tab tab_1
              WHERE tab_1.K = tab.K and tab_1.value not in ('A', 'B'))
于 2012-11-07T13:51:01.930 に答える