Подзапрос без результата
У меня есть два запроса, которые я хотел бы объединить в один.
Запрос 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