Подзапрос без результата

У меня есть два запроса, которые я хотел бы объединить в один.

Запрос 1: SELECT Quantity FROM Table1 WHERE IdProduct = 1234

Запрос 2: SELECT Supplier FROM Table2 WHERE IdProduct = 1234

Вот что я сделал:

SELECT
   bloc1.Quantity AS qty,
   bloc2.Supplier AS supplier
FROM    
   (SELECT Quantity FROM Table1 WHERE IdProduct = 1234) bloc1,
   (SELECT Supplier FROM Table2 WHERE IdProduct = 1234) bloc2

В большинстве случаев все идет хорошо, но, к сожалению, иногда один из двух запросов не возвращает результата... В этом конкретном случае два запроса "терпят неудачу".

5 ответов

Решение

Ваш код делает CROSS JOINрезультатов 2 запросов.
Поэтому, если какой-либо из них не возвращает строк, результатом будет отсутствие строк.

Вместо этого используйте результат 2 запросов в качестве столбцов, если вы уверены, что они вернут только 1 строку:

SELECT 
  (SELECT Quantity FROM Table1 WHERE IdProduct = 1234) qty,
  (SELECT Supplier FROM Table2 WHERE IdProduct = 1234) supplier

U может присоединиться к двум таблицам table1 и table2, вы можете:

 SELECT qty,sup
    FROM   (SELECT Quantity as qty,supplier as sup
        FROM Table1 
        INNER JOIN Table2
        ON table1.IdProduct=table2.IdProduct AND IdProduct=1234);

Вы можете проверить это для получения дополнительной информации о соединениях в mysql https://www.mysqltutorial.org/mysql-join/

Для меня замечательно, что такое объединение этих запросов когда-либо работает. Но если вы хотите, чтобы он пережил нехватку записей в одной из этих таблиц, вам понадобитсяOUTER JOINкакой-то. См. https://dev.mysql.com/doc/refman/5.7/en/join.html.

Вы можете попробовать следующее -

select 
(SELECT Quantity FROM Table1 WHERE IdProduct = 1234) as qty,
(SELECT Supplier FROM Table2 WHERE IdProduct = 1234) as supplier

Вероятно, вам нужно "полное внешнее соединение". К сожалению, MySQL не реализует полные внешние соединения (почему в наши дни?).

В любом случае, вы можете смоделировать это с помощью обходного пути:

SELECT
   bloc1.Quantity AS qty,
   bloc2.Supplier AS supplier
FROM (SELECT Quantity FROM Table1 WHERE IdProduct = 1234) bloc1
LEFT JOIN (SELECT Supplier FROM Table2 WHERE IdProduct = 1234) bloc2 on 1 = 1
UNION
SELECT
   bloc1.Quantity AS qty,
   bloc2.Supplier AS supplier
FROM (SELECT Quantity FROM Table1 WHERE IdProduct = 1234) bloc1
RIGHT JOIN (SELECT Supplier FROM Table2 WHERE IdProduct = 1234) bloc2 on 1 = 1

В MySQL 8.x вы можете удалить избыточность (и несколько сократить ее) с помощью CTE. Например:

with
bloc1 as (SELECT Quantity FROM Table1 WHERE IdProduct = 1234),
bloc2 as (SELECT Supplier FROM Table2 WHERE IdProduct = 1234)
SELECT
   bloc1.Quantity AS qty,
   bloc2.Supplier AS supplier
FROM bloc1 LEFT JOIN bloc2 on 1 = 1
UNION
SELECT
   bloc1.Quantity AS qty,
   bloc2.Supplier AS supplier
FROM bloc1 RIGHT JOIN bloc2 on 1 = 1
Другие вопросы по тегам