2012-04-03 4 views
5

Есть ли способ написать один запрос, чтобы проверить, соответствует ли набор строк набору значений? У меня есть одна строка для набора значений, которые мне нужно сопоставить, и я хотел бы знать, соответствуют ли все строки или нет. Я мог бы выполнить это через несколько запросов, таких как:Проверьте, соответствует ли несколько записей набору значений

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

... и так далее, вплоть до произвольного количества запросов. Как это можно переписать в виде единого запроса, когда запрос возвращается ТОЛЬКО, если все значения совпадают?

+0

Хм, но как может 'value1' соответствовать' someValue1', а также 'someOtherValue1'? –

ответ

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

+0

@ Mark Bannister, я не понимаю, как использовать concat, и, кажется, вы пропустили закрытие круглых скобок после того, где. Можете ли вы объяснить этот ответ? – Raffaele

+0

@ Раффаэле: Я обновил ответ - надеюсь, теперь это немного яснее. –

2

насчет:

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

Я уточнил свой вопрос немного больше - в этом примере я ожидаю две строки, так как у меня есть два набора значений, которые мне нужно сопоставить. Я полагаю, что запрос, который вы предложили, будет удовлетворен только одной строкой, поскольку он использует предложения IN. – Josh

+0

@ Josh Я вас не совсем понял, можете ли вы разместить пример? –

Смежные вопросы