Подзапрос без результата - PullRequest
0 голосов
/ 13 июля 2020

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

Запрос 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

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

Ответы [ 5 ]

0 голосов
/ 13 июля 2020

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

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

SELECT 
  (SELECT Quantity FROM Table1 WHERE IdProduct = 1234) qty,
  (SELECT Supplier FROM Table2 WHERE IdProduct = 1234) supplier
0 голосов
/ 13 июля 2020

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

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

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

0 голосов
/ 13 июля 2020

Вероятно, вам нужно «полное внешнее соединение». К сожалению, 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

In 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
0 голосов
/ 13 июля 2020

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

select 
(SELECT Quantity FROM Table1 WHERE IdProduct = 1234) as qty,
(SELECT Supplier FROM Table2 WHERE IdProduct = 1234) as supplier
0 голосов
/ 13 июля 2020

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

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