Левое объединение SQL на основе критериев, которые могут отсутствовать - PullRequest
0 голосов
/ 24 июня 2011

У меня есть несколько таблиц, которые я хочу объединить для одного большого запроса.Критерии поиска основаны на двух таблицах: section_types и sections.Я хочу вытащить все section_types и связанные с ними sections, где sections соответствуют определенным критериям, плюс все section_types, которые активны, но с которыми sections не связаны.Это похоже на базовый LEFT JOIN, но я думаю, потому что некоторые из моих критериев фильтрации основаны на sections, я не могу получить section_types, у которых нет связанных sections

`section_types`

id | name | active
---+------+-------
 1 | a    | 1
 2 | b    | 0
 3 | c    | 1

`sections`

type | issue | location 
-----+-------+----------
1    | 0611  | 1
2    | 0611  | 1
1    | 0511  | 1

СкажиЯ хочу получить все разделы для выпуска 0611 в местоположении 1, а также любые пустые типы разделов.Вот так:

(отредактировано, см. Ниже)

Но я получаю только section_types, которые имеют sections.Таким образом, в этом запросе section_types строка 3 не будет отображаться.Что я делаю не так?

РЕДАКТИРОВАТЬ:

Я получаю все section_types сейчас, но не все sections мне нужно.Я думаю LEFT JOIN сделает это.Может быть много sections для каждого section_type или ни одного.Мой запрос на данный момент:

SELECT * FROM `section_types` st
    RIGHT JOIN `sections` s
        ON s.type=st.id
            AND s.issue='0611'
            AND s.location=1
WHERE st.active OR s.issue IS NOT NULL
ORDER BY st.id

, который получает меня:

id | name | active | issue | location
---+------+--------+-------+---------
1  | a    | 1      | 0611  | 1
2  | b    | 0      | 0611  | 1
3  | c    | 1      |       |

, но мне все еще нужен второй тип-1 section

Ответы [ 3 ]

1 голос
/ 24 июня 2011

РЕДАКТИРОВАТЬ

Я удалил это, но, основываясь на разговоре, я думаю, что это завершает то, что вы ищете.

ОРИГИНАЛ

Похоже на хак ... но я думаю, что это работает.

Declare @tmp TABLE(
    id int,
    name varchar(50),
    active int,
    type int,
    issue int,
    location int
)
Insert Into @tmp
SELECT * FROM section_types st
    LEFT JOIN sections s
        ON st.id=s.type
            AND s.issue='0611'
            AND s.location=1 
WHERE st.active = 1 OR s.issue IS NOT NULL
ORDER BY st.id

Select * FROM @tmp 
UNION 
Select 
    *, NULL, NULL, NULL 
From 
    section_types 
WHERE 
    id NOT IN ( SELECT id FROM @tmp)
    AND active = 0
0 голосов
/ 24 июня 2011

Это то, что вам нужно?

Все section_types и ВСЕ связанные с ними разделы, где хотя бы один раздел имеет проблему '0611' и местоположение 1. Плюс ко всем остальным активным section_types:

    SELECT *
    FROM section_types st
        JOIN sections s
            ON s.type = st.id
    WHERE EXISTS
        ( SELECT *
            FROM sections s2
            WHERE s2.type = st.id
              AND s2.issue = '0611'
              AND s2.location = 1
        ) 
UNION ALL
    SELECT *, NULL, NULL, NULL
    FROM section_types st
    WHERE st.active
      AND NOT EXISTS
        ( SELECT *
            FROM sections s2
            WHERE s2.type = st.id
              AND s2.issue = '0611'
              AND s2.location = 1
        ) 
ORDER BY id
0 голосов
/ 24 июня 2011

Вы просто перевернули свои таблицы. LEFT OUTER JOIN требует, чтобы в таблице left была строка для условия ON. Используйте RIGHT OUTER JOIN или поменяйте местами столы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...