Возможно ли превратить два оператора select в один без ОБЪЕДИНЕНИЯ ALL / UNION, когда единственным различием являются две строки?

#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. Не совсем, в конечном результате не хватает нескольких строк