#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() сработал идеально, спасибо!