2012-11-20 35 views
5

例如名單上,如果我如下表選擇基於獨特的雙

Id  Key    Value 

1   A    Alpha 
2   B    Alpha 
3   A    Charlie 

我就把輸入{(A,查理)和(B,阿爾法)}和我要求返回所有的ID我希望它返回2和3,但不是1.

這樣做的最佳方法是什麼?我可以將它全部組合成一個查詢,(爲了速度),還是必須爲我收到的每個值對運行重複查詢。

+6

什麼RDBMS您使用的?輸入如何存儲在變量或其他內容中?您打算如何調用查詢? – LittleBobbyTables

+0

我在RDBMS上有點困惑,但我正在使用postgre並使用hibernate使用java訪問數據庫。 – Landister

+0

請注意,這是Postgres而不是Postgre –

回答

9

我覺得PostgreSQL有最優雅的解決方案:

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

SQL Fiddle Example

在2008年SQL-SERVER及以後你可以用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 Fiddle Example

O r代表一個過程中,您可以創建一個鍵值對的類型和傳遞這個作爲一個參數:

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 Fiddle Example

對於MySQL我想你可能只是建立這個使用AND/OR

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

Example on SQL Fiddle

我對其他數據庫管理系統的知識是有限的,所以如果它不是上述抱歉之一,我不能有更多的幫助。

EDIT(隨着a_horse_with_no_name幫助)

PostgreSQL的語法也適用於Oracle(我認爲DB2)

+1

PostgreSQL語法也適用於Oracle(我認爲DB2) –