Объединение двух таблиц на основе данных третьей таблицы

#mysql #sql

Вопрос:

У меня есть 3 таблицы, ради этого упражнения мы назовем их: Продукты, Цена и Скидка. Я пытаюсь объединить таблицы продуктов и цен, только если идентификатор продукта находится в разделе Скидка.ProductID (столбец ProductID в таблице скидок).

Продукты:

ProductID Размер Цвет Ссылка#
А1234 Маленький Блу 0С94
B5678 Медицинский Красный 1D96

Цена:

Ссылка# База Налог
0С94 3.48 0.96

Скидка:

ProductID Список Сайт
А1234 Два Три

Я знаком с объединениями, поэтому мой код начинается с:

 SELECT * FROM Product as a
left join Price as b
on a.Ref# = b.Ref#
 

но я никогда не вкладывал ограничения в предложение where (если это вообще правильный подход) на основе третьей таблицы. Любой совет был бы очень признателен. Конечным результатом будет таблица новых продуктов, в которой будет показан только один продукт, поскольку ProductID B5678 отсутствует в таблице скидок.

Комментарии:

1. Может быть SELECT * FROM Product as a left join Price as b on a.Ref# = b.Ref# inner join Discount as d on a.ProductID = d.ProductId

2. Это свойство внутреннего соединения. Внутренние соединения создают только одну (или несколько) строк в результате, в которых в соединяемых столбцах имеются соответствующие значения. Вы начали с «левого соединения», которое совпадает с «левым внешним соединением». Свойство внешнего соединения заключается в том, что таблица, указанная по направлению (влево или вправо), вернет строку независимо от того, есть совпадение или нет. Смотрите решение Бармара.

Ответ №1:

Просто выполните объединение из 3 таблиц.

 SELECT DISTINCT a.*, b.*
FROM Product AS a
JOIN Price AS b ON a.`Ref#` = b.`Ref#`
JOIN Discount AS c ON a.ProductID = c.ProductID
 

Ответ №2:

Если вам не нужно какое-либо содержимое таблицы скидок, используйте функцию exists() для выполнения подзапроса в предложении where. Это даст вам самые быстрые результаты.

 SELECT * 
FROM Product as a
   left join Price as b on a.Ref# = b.Ref#
WHERE EXISTS (
      SELECT *
      FROM Discount as c
      WHERE c.ProductID = a.ProductID
   )
 

Однако, если вам нужен один или несколько столбцов Скидки, выполните внутреннее соединение между Продуктом и скидкой, соединив их в идентификаторе продукта. Это приведет к тому, что только продукты со скидкой, а затем присоедините еще один левый элемент к цене, чтобы столбцы из Цены также попали в набор результатов. Однако имейте в виду, что в случае наличия нескольких строк Скидки для одной строки товара это приведет к тому, что один и тот же товар будет показан в нескольких строках.

 SELECT * 
FROM Product as a
   inner join Discount as c on c.ProductID = a.ProductID
   left join Price as b on a.Ref# = b.Ref#
 

Комментарии:

1. Подход Exists() сработал идеально, спасибо!