4

次の2つのテーブルがあります。

CREATE List (
    id   INTEGER,
    type INTEGER REFERENCES Types(id),
    data TEXT,
    PRIMARY_KEY(id, type)
);

CREATE Types (
    id   INTEGER PRIMARY KEY,
    name TEXT
);

List次に、タイプ文字列を指定したすべてのIDを判別するクエリを作成します。

例えば、

リスト:
10「一部のテキスト」
11「モアテキスト」
20「フー」
31「バー」
32「BarBaz」
40「バズ」
41「FooBar」
42「FooBarBaz」

タイプ:
0「Key1」
1「Key2」
2「Key3」

入力「Key1」、「Key2」が与えられると、クエリは1、4を返す必要があります。

入力「Key2」、「Key3」が与えられると、クエリは3、4を返す必要があります。

入力「Key2」が与えられると、クエリは1、3、4を返す必要があります。

ありがとう!

4

3 に答える 3

5
select distinct l.id 
from list l
inner join types t on t.id = l.type
where t.name in ('key1', 'key2')
group by l.id
having count(distinct t.id) = 2

where句に入れるキーの数に合わせてhaveing句を調整する必要があります。1つのキーの例:

select distinct l.id 
from list l
inner join types t on t.id = l.type
where t.name in ('key2')
group by l.id
having count(distinct t.id) = 1

SQlFiddleの例

于 2012-08-04T19:53:53.073 に答える
2

次のトリックを使用して、Jurgenのアイデアを拡張できます。

with keys as (
    select distinct t.id
    from types t
    where t.name in ('key1', 'key2')
)
select l.id 
from list l join
     keys k
     on l.type = keys.id cross join
     (select count(*) as keycnt from keys) k
group by l.id
having count(t.id) = max(k.keycnt)

つまり、サブクエリで一致するキーを計算し、これをカウントに使用します。このように、キー値を入力するために1行を変更するだけでよく、必要な数のキーを持つことができます。(注として、私はこのSQLをテストしていないので、構文エラーについてお詫びします。)

于 2012-08-04T20:05:39.073 に答える
1

SQLを動的に生成できる場合、これは多くのDBMSで最も効率的な方法の1つである可能性があります。

SELECT l.id
FROM   List  l
  JOIN Types t1  ON t1.id = l.type
  JOIN Types t2  ON t2.id = l.type
WHERE  t1.name = 'Key1'
  AND  t2.name = 'Key2' ;

同じ結果を得る10以上の方法に加えて、いくつかのベンチマーク(Postgres用)を含むこの同様の質問を参照してください:SQL結果をhas-many-through関係でフィルタリングする方法

于 2012-08-04T20:17:25.667 に答える