6

たとえば、次の表が与えられた場合

Id        Key             Value

 1          A             Alpha
 2          B             Alpha
 3          A             Charlie

そして、入力 {(A, Charlie) and (B, Alpha)} を取得し、1 ではなく 2 と 3 を返したいすべての ID を返すように要求しました。

これを行う最善の方法は何ですか?すべてを 1 つのクエリにまとめることはできますか (速度を上げるため)、または受け取った値のペアごとに繰り返しクエリを実行する必要がありますか。

4

1 に答える 1

12

Postgresql には最も洗練されたソリューションがあると思います。

SELECT  *
FROM    T
WHERE   ("Key", "Value") IN (('B', 'Alpha'), ('A', 'Charlie'));

SQL フィドルの例

SQL-SERVER 2008 以降ではVALUES、タプルを構築するために使用できます。

SELECT  T.*
FROM    T
        INNER JOIN
        (   VALUES
                ('B', 'Alpha'),
                ('A', 'Charlie')
        ) v (Key, Value)
            ON v.Key = T.Key
            AND v.Value = T.Value

SQL フィドルの例

または、プロシージャの場合、キーと値のペアの型を作成し、これをパラメーターとして渡すことができます。

CREATE TYPE KeyValuePair AS TABLE ([Key] VARCHAR(1), [Value] VARCHAR(7));

DECLARE @T AS KeyValuePair
INSERT @T 
VALUES
    ('B', 'Alpha'),
    ('A', 'Charlie')


SELECT  T.*
FROM    T
        INNER JOIN @T v
            ON v.[Key] = T.[Key]
            AND v.Value = T.Value;

SQL フィドルの例

MySQLの場合、これを使用してビルドする必要があると思いますAND/OR

SELECT  *
FROM    T
WHERE   (`Key` = 'A' AND `Value` = 'Charlie')
OR      (`Key` = 'B' AND `Value` = 'Alpha')

SQL Fiddle の例

他の DBMS に関する私の知識は限られているため、上記のいずれでもない場合は、申し訳ありませんが、これ以上お役に立てません。

編集 ( a_horse_with_no_nameの助けを借りて)

PostgreSQL 構文はOracleでも機能します(DB2 だと思います)。

于 2012-11-20T17:12:40.213 に答える