Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Некорректное появление дублей  [new]
svanrus
Member

Откуда:
Сообщений: 53
Добрый день!

Имеется 5 таблиц. Таблицы 2,3,4,5 матчатся с таблицей 1 по одинаковым условиям.

Всё это дело реализовано через примерно такую форму

select *
from table1 a
left join table2 b on a.id = b.id and a.type = 'Red' and a.number = b.number
left join table3 c on a.id = c.id and a.type = 'White' and a.number = c.number
left join table4 d on a.id = d.id and a.type = 'Green' and a.number = d.number
left join table5 e on a.id = e.id and a.type = 'Blue' and a.number = e.number

Предположим, что в таблице 1 одна уникальная строка. После к ней ещё хотят подцепиться 4 группы столбцов.
Рассмотрим пример когда из таблицы b и c ,по условиям, никого не находится.
И тут внимание,

в таблице e нашлось 2 договора подходящие под условия, тем самым уникальная строка из таблицы a дублируется, чтобы
отобразить эти 2 договора. В связи с этим задублировались строки из таблицы а, что корректно.

В таблице d нашёлся 1 договор по , который совпал по условиям.
В таком случае хотелось бы видеть этот 1 договор, который был бы притянут к одной из уже 2 строк. Но тянется к двум дубликатами.

Была идея около каждого продукта пронумеровать такие дубли rownum over partition тратата...
Но запрос стал жутко долго думать.

Вопрос, как можно избежать таких дублей.
17 ноя 17, 13:42    [20963417]     Ответить | Цитировать Сообщить модератору
 Re: Некорректное появление дублей  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
DISTINCT  
?
17 ноя 17, 13:45    [20963427]     Ответить | Цитировать Сообщить модератору
 Re: Некорректное появление дублей  [new]
svanrus
Member

Откуда:
Сообщений: 53
Cammomile,

в каком месте ?
17 ноя 17, 13:55    [20963454]     Ответить | Цитировать Сообщить модератору
 Re: Некорректное появление дублей  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Вот в этом.
17 ноя 17, 14:06    [20963508]     Ответить | Цитировать Сообщить модератору
 Re: Некорректное появление дублей  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
svanrus
Вопрос, как можно избежать таких дублей
Обеспечить, чтобы
svanrus
в таблице e НЕ нашлось 2 договора подходящие под условия
Чтобы этих договоров было 0 или 1.
Раз вам не понравился результат, значит, таблицы были спроектированы неверно и заполнены неверными данными.
Иначе даже непонятно, какие строки должны быть удалены из результирующего набора.
17 ноя 17, 14:24    [20963593]     Ответить | Цитировать Сообщить модератору
 Re: Некорректное появление дублей  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7663
svanrus,

автор
Вопрос, как можно избежать таких дублей.


КО говорит - обеспечить уникальность договоров в таблицах b,c,d,e.
17 ноя 17, 15:19    [20963798]     Ответить | Цитировать Сообщить модератору
 Re: Некорректное появление дублей  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20491
svanrus
хотелось бы видеть этот 1 договор, который был бы притянут к одной из уже 2 строк.
Желание лишено логики. Вот если бы запись в D была связана одной из двух записей в E - логика бы была.
17 ноя 17, 15:43    [20963919]     Ответить | Цитировать Сообщить модератору
 Re: Некорректное появление дублей  [new]
svanrus
Member

Откуда:
Сообщений: 53
Логика у всех разная,

в данном примере она заключается в том, что по одному событию может быть зарегистрировано несколько мероприятий.

Решил в итоге так. Проранжировал договоры из каждой таблицы по номеру. В итоге при построении сводных можно выбрать только те договора у которых "rn" = 1. (rn = 2 - это тот самый лишний дубль из столбца е, который описан у меня в примере).
17 ноя 17, 16:00    [20964029]     Ответить | Цитировать Сообщить модератору
 Re: Некорректное появление дублей  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Можно еще заменить
LEFT JOIN -> OUTER APPLY  ( SELECT TOP 1 ...  ORDER BY )
INNER JOIN -> CROSS APPLY  ( SELECT TOP 1 ... ORDER BY )

SELECT
  *
FROM
  dbo.[table1] a
  OUTER APPLY (
    SELECT TOP 1
      *
    FROM
      dbo.[table2] b
    WHERE
          a.[type] = 'Red'
      AND b.[id] = a.[id]
      AND b.[number] = a.[number]
    ORDER BY
      ...
  ) b
  ...
17 ноя 17, 16:10    [20964081]     Ответить | Цитировать Сообщить модератору
 Re: Некорректное появление дублей  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7663
svanrus,

все равно не понятно - чем одна запись из таблицы мероприятий б,ц,д хуже другой и почему её не надо выбирать. Почему этот "дубль" "лишний". С чего бы строки были лишними где-то? Они не лишние, поскольку существуют.
Я думаю, что автору нужен exists, а не join.
17 ноя 17, 16:50    [20964325]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить