#sql
#sql
Вопрос:
Если у вас есть 2 SELECT
совершенно одинаковых запроса, но единственное отличие заключается в том, что один запрос имеет 3 INNER JOINS
, а другой имеет 2 INNER JOINS
и у одного из них есть только 1 дополнительный WHERE
критерий, возможно ли объединить их в один SELECT
оператор без использования UNION ALL/UNION
, когда вы хотите получить результаты от обоих?
Пример запроса 1:
SELECT a.id, a.name, b.type
FROM TableA a
INNER JOIN TableB b on a.id = b.a_id
WHERE
a.lang < '20'
Пример запроса 2a:
SELECT a.id, a.name, b.type
FROM TableA a
INNER JOIN TableB b on a.id = b.a_id
INNER JOIN TableC c on a.id = c.a_id
WHERE
a.id < '20'
c.lang = 'French'
Что делать, если запрос имеет 3 различия?
Пример запроса 2b:
SELECT a.id, a.name, b.type
FROM TableA a
INNER JOIN TableB b on a.id = b.a_id
INNER JOIN TableC c on a.id = c.a_id
WHERE
a.id < '20'
a.year = '2020'
c.lang = 'French'
Комментарии:
1. Я не уверен, что понимаю ваш пример; последнее является подмножеством первого. Что вы хотите вернуть?
2. Я хотел бы, чтобы результаты были такими же, как если бы я использовал ключевое слово UNION для объединения примеров запросов 1 и 2a или примеров запросов 1 и 2b
Ответ №1:
SELECT a.id, a.name, b.type
FROM TableA a
INNER JOIN TableB b on a.id = b.a_id
LEFT JOIN TableC c on a.id = c.a_id and c.lang = 'French'
WHERE
a.id < '20'
Ответ №2:
Я полагаю, что единственное различие между вашими двумя запросами заключается в том, что первый не требует c.lang = 'French'
, но второй запрос требует… в этом примере не является ли первый запрос надмножеством второго запроса, только с меньшим количеством дубликатов?
Если это верно только потому, что это упрощенный пример, следующий запрос должен обрабатывать ситуации такого типа…
РЕДАКТИРОВАТЬ: я только что заметил пример 3-го запроса в вашем сообщении … в принципе, все, что ограничивает второй запрос пределами первого запроса, должно быть добавлено в LEFT JOIN
предложение, а не в WHERE
предложение…
SELECT a.id, a.name, b.type
FROM TableA a
INNER JOIN TableB b on a.id = b.a_id
LEFT JOIN TableC c on a.id = c.a_id AND c.lang = 'French' AND a.year = '2020'
WHERE a.id < '20'
Комментарии:
1. Первый запрос представляет собой в некотором роде супернабор. Но в запросе 1 отображается 3, Лондон, Остров; 5, Дублин, остров; и Осло, внутри страны, в то время как в запросе 2 отображается только 4, Париж, внутри страны. Мне просто было любопытно, можно ли в результате получить все четыре города без необходимости использовать UNION или UNION ALL.
2. Отображает ли запрос с
LEFT JOIN
желаемые результаты?3. Не совсем, в конечном результате не хватает нескольких строк