2

次の形式のテーブルがあります。

row_key  extID  tag   val
-------  -----  ---   ---
1         1     A     a
2         1     A     b
3         1     B     c
4         2     A     d
5         2     C     e

ここで、特定の値を持つ(tag、val)のペアがいくつかあるすべてのextIDを取得したいと思います。次に例を示します。

(tag, val) = (A,a) AND (tag, val) = (B,c)

また、

(tag, val) = (C,e)

制約の数は変更できます。

私はこれを行うためのいくつかの方法を考えることができます:

  1. 制約ごとに自己結合を実行します
  2. 呼び出し元プログラムで(繰り返し)検索を実行します(複数のSQLクエリ)
  3. (たぶん?)これを行うためのSQL関数を書く
  4. ネストされたSELECT句(外部レベルに「extID」を渡し、WHERE extID IN (SELECT extID FROM ...)
  5. 私が見つけることができない唯一の真の解決策。

これを行うための好ましい(最も速くて最もエレガントな)方法はどれですか?(もちろん、「確かに、5。が正解です。」を除いて)

複数のSELF-joinは非常にエレガントだと思います。しかし、それが高速で比較的メモリ効率が良いかどうかはわかりません。

さらに、MySQL、PostgreSQL、SQLiteを適応させずに動作する方法を使用したいので、PIVOTafaiuを使用できません。

4

2 に答える 2

2
SELECT  extID
FROM    tableName
WHERE   (tag = 'A' AND val = 'a') OR
        (tag = 'B' AND val = 'c')
GROUP   BY extID
HAVING  COUNT(*) = 2

更新1

tagとの組み合わせが重複する可能性があることについては言及していないためvalDISTINCTキーワードが必要です。

SELECT  extID
FROM    tableName
WHERE   (tag = 'A' AND val = 'a') OR
        (tag = 'B' AND val = 'c')
GROUP   BY extID
HAVING COUNT(DISTINCT tag, val) = 2
于 2013-02-18T08:51:34.757 に答える
0

タプル構文は機能します:

SELECT  extID
FROM    tableName
WHERE   (tag, val) in (('A', 'a'), ('B', 'c'))
GROUP   BY extID
HAVING  COUNT(DISTINCT tag, val) = 2

HAVING COUNT(DISTINCT tag, val) = 2、各制約タプルが少なくとも1回存在することを保証します。これは2、クエリ内の制約タプルの数に合わせて調整する必要があることを意味します。

('C', 'e')これは、このような2つの同一の行があり、条件が次の場合でも機能します。

row_key  extID  tag   val
-------  -----  ---   ---
5         2     C     e
6         2     C     e

これに対するクエリは次のようになります。

SELECT  extID
FROM    tableName
WHERE   (tag, val) in (('C', 'e'))
GROUP   BY extID
HAVING  COUNT(DISTINCT tag, val) = 1
于 2013-02-18T08:55:19.060 に答える