@roflanPominki

Из-за чего может повторяться строка при присоединении нескольких таблиц?

use PhonesShop
declare @SettingForFilter date
set @SettingForFilter = '2021-10-12'
select distinct *
from Orders LEFT JOIN Customers on Orders.CustomerCode = Customers.CustomerCode 
LEFT JOIN Accessories on Orders.AccessorieCode1 = Accessories.AccessorieCode or Orders.AccessorieCode2 = Accessories.AccessorieCode or Orders.AccessorieCode3 = Accessories.AccessorieCode 
LEFT JOIN Services on Orders.ServiceCode1 = Services.ServiceCode or Orders.ServiceCode2 = Services.ServiceCode or Orders.ServiceCode3 = Services.ServiceCode
LEFT JOIN Workers on Orders.WorkerCode = Workers.WorkerCode
where Orders.OrderDate = @SettingForFilter

Я не могу понять из за чего у меня появляется дубликат(целых 18 одинаковых строк)6207ca484eea7559742500.png
  • Вопрос задан
  • 133 просмотра
Решения вопроса 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
LEFT JOIN Accessories on Orders.AccessorieCode1 = Accessories.AccessorieCode 
  OR Orders.AccessorieCode2 = Accessories.AccessorieCode 
  OR Orders.AccessorieCode3 = Accessories.AccessorieCode
Это соединение повторяется 3 раза (для каждого поля).
LEFT JOIN Services on Orders.ServiceCode1 = Services.ServiceCode 
 OR Orders.ServiceCode2 = Services.ServiceCode 
 OR Orders.ServiceCode3 = Services.ServiceCode
И ещё 3 раза. Уже 3 * 3 = 9 раз, например, первые строки.

Поэтому нужно связывать каждое поле отдельно:
SELECT *
  FROM Orders 
    LEFT OUTER JOIN Accessories AS A1 ON Orders.AccessorieCode1 = A1.AccessorieCode 
    LEFT OUTER JOIN Accessories AS A2 ON Orders.AccessorieCode2 = A2.AccessorieCode
    LEFT OUTER JOIN Accessories AS A3 ON Orders.AccessorieCode3 = A3.AccessorieCode
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
нужно твердо запомнить что

JOIN

это Декартово произведение

т.е. с твоими 4 JOIN комбинаций будет 2 в кубе

а уже всякие WHERE его прореживают и отбрасывают неудовлетворяющие элементы
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы