2012-04-03 76 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

相关问题