2013-12-11 36 views
3

這樣的查詢作爲標題看起來像這樣我猜:一個選擇多個記錄由複合鍵

select * from table t where (t.k1='apple' and t.k2='pie') or (t.k1='strawberry' and t.k2='shortcake') 
... --10000 more key pairs here 

這看起來相當冗長我。任何更好的選擇? (目前使用SQLite,可能會使用MYSQL/Oracle的。)

回答

2

可以使用例如這對甲骨文,我認爲如果你使用普通的連擊(),而不是甲骨文||在其他數據庫上,它也可以工作(因爲它只是與IN列表進行字符串比較)。請注意,這樣的查詢可能會有不理想的執行計劃。

SELECT * 
FROM 
    TABLE t 
WHERE 
    t.k1||','||t.k2 IN ('apple,pie', 
         'strawberry,shortcake'); 

但是,如果您將您的值列表存儲在其他表中,則Oracle還支持以下格式。

SELECT * 
FROM 
    TABLE t 
WHERE (t.k1,t.k2) IN (SELECT x.k1, x.k2 FROM x); 
+0

謝謝。我正在考慮你的第二個解決方案,但另一個將在未來增長的小型應用程序的10萬行表格看起來太耗費資源。至於第一個,你建議爲我的原始方法生成代碼在性能方面更好? – zeller

+0

我不太確定,大量的OR列表沒有提示任何好的東西。試試Ronnis建議的解決方案,如果它適用於您的數據庫。我試過了,它顯然也適用於Oracle。 – tvm

1
SELECT * FROM tableName t 
WHERE t.k1=(CASE WHEN t.k2=VALUE THEN someValue 
        WHEN t.k2=otherVALUE THEN someotherValue END) 

- SQL FIDDLE

+0

我不完全理解很遺憾這個樣子......這如何處理多個複合鍵? – zeller

+0

我已經測試過SQL Server的查詢。我正在考慮表格有兩列k1和k2的一般場景。 –

+0

好吧。不幸的是,這仍然隨着輸入的大小而增長。有沒有什麼辦法可以用'in'來做到這一點,所以唯一的增長部分是輸入? – zeller

2
select * from table t 
where (t.k1+':'+t.k2) 
in ('strawberry:shortcake','apple:pie','banana:split','etc:etc') 

這在大多數的,因爲它串聯的情況下工作,並作爲一列

場外,你需要選擇一個合適的分離器,這將永遠不會在K1的價值發現在和k2。例如對於例如 如果k1和k2的類型爲int,則可以將任何字符作爲分隔符

2

不要害怕冗長的語法。級聯技巧可以輕易搞亂選擇性估計,甚至阻止數據庫使用索引。

這是另一種語法,可能會或可能不會在您的數據庫中工作。

select * 
    from table t 
where (k1, k2) in(
      ('apple',  'pie') 
      ,('strawberry', 'shortcake') 
      ,('banana',  'split') 
      ,('raspberry', 'vodka') 
      ,('melon',  'shot') 
     ); 

最後的評論是,如果你發現自己想提交1000個值過濾器,你應該最有可能的一種不同的方法都在一起:)

+0

sql server不支持這個,請你舉個例子RDBMS支持上面的語法謝謝 –

+0

Oracle支持這個語法。 – Ronnis