2016-05-19 4 views
1

Как вернуть строку (желательно в ANSI SQL), когда объединенная таблица имеет ВСЕ соответствующие строки на моем on?Как вернуть строку, в которой все соединения существуют? SQL

Пример неправильного поведения:

SELECT table1.* 
    , whatever 
FROM table1 
     INNER JOIN table2 ON table2.whateverrelation = table1.whateverrelation 
         AND table2.matching IN(1, 2); 

будет возвращать каждый table1 строку с согласующим соотношением на table2, который равен 1 или 2 (т.е. возвращает table1 строку с одним или несколькими matching полями

.

Как я могу получить что-то, что возвращает только строки table1, которые связаны с строками table2 и чьи matching являются ОБА 1 и 2 (поэтому AND, а не OR, поэтому должно быть не менее одного table2 с matching = 1 и по крайней мере один с matching = 2, поэтому он не будет показывать строку table1 без обоих совпадений)?

Я бы предпочел не делать два подключения к одному и тому же столу, я знаю, что я мог бы просто добавить левое соединение дважды, один для соответствия 1 и один, чтобы соответствовать 2, но я не знаю заранее, сколько совпадений Мне нужно.

Приветствия

ответ

0

Вы coud использовать:

SELECT table1.col1, .... 
FROM table1 
INNER JOIN table2 
    ON table2.whateverrelation = table1.whateverrelation 
GROUP BY table1.col1, .... 
HAVING SUM(table2.matching = 1) > 0 
    AND SUM(table2.matching = 2) > 0; 
+0

я приспособился, что быть: 'HAVING SUM ((table2.matching = 1) :: Int)> 0 ', как Postgres была проблема суммирующий булевы , Это все еще запутанно, но, возможно, это лучшее, что я могу получить. Если есть способ объединить эти два, это будет идеально. –

+0

@DanDart Да, 'SUM (...> 0)' будет работать с MySQL (вопросительный тег). Если вы используете PostgreSQL, тогда используйте 'CASE', как вы предложили. – lad2025

+0

Да, я пытаюсь заставить его работать SQL-агностически. –