2012-04-03 77 views
5

有沒有辦法編寫單個查詢來檢查一組行是否與一組值匹配?每行值需要匹配一行,我想知道所有行是否匹配。我可以通過多個查詢來執行此操作,例如:檢查多個記錄是否與一組值相匹配

select * from tableName where (value1, value2) = ('someValue1', 'someValue2') 
select * from tableName where (value1, value2) = ('someOtherValue1', 'someOtherValue2') 

...等等,最多爲任意數量的查詢。這種事情怎麼會被重新編寫爲一個查詢,只有當所有的值都匹配時查詢才返回?

+0

嗯,但'value1'如何匹配'someValue1'和'someOtherValue1'? – 2012-04-03 07:18:30

回答

2

你可以嘗試這樣的:

select t.* 
from tableName t 
join (select 'someValue1' value1, 'someValue2' value2 union all 
     select 'someOtherValue1', 'someOtherValue2') v 
    on t.value1 = v.value1 and t.value2 = v.value2 
where 2= 
(select count(distinct concat(v1.value1, v1.value2)) 
from (select 'someValue1' value1, 'someValue2' value2 union all 
     select 'someOtherValue1', 'someOtherValue2') v1 
join tableName t1 
    on t1.value1 = v1.value1 and t1.value2 = v1.value2) 

如果你有大量的要檢查值對,它可能更容易將它們插入到一個臨時表並使用上述查詢中的臨時表,而不是兩個單獨的硬編碼虛擬表。

+1

優秀的東西 - 非常感謝! – Josh 2012-04-03 16:30:24

+0

@Mark Ba​​nnister,我不明白concat的用法,看來你錯過了where後面的右括號。你能解釋這個答案嗎? – Raffaele 2012-04-06 23:12:34

+0

@Raffaele:我已經更新了答案 - 我希望現在更清楚一點。 – 2012-04-07 09:33:50

2

什麼:

SELECT * 
FROM tableName 
WHERE value1 IN ('someValue1', 'someOtherValue1') AND 
     value2 IN ('someValue2', 'someOtherValue2') 
+0

我再次澄清了我的問題 - 在這個例子中,我期待兩行,因爲我有兩組值需要匹配。因爲它使用IN子句,所以我相信你所建議的查詢只能滿足一行。 – Josh 2012-04-03 06:42:57

+0

@Josh我不太瞭解你,你能舉個例子嗎? – 2012-04-03 06:46:11

相關問題