powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Join по нескольким полям с null
9 сообщений из 9, страница 1 из 1
Join по нескольким полям с null
    #39954728
Lania
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Подскажите, как оптимальнее написать запрос.

Есть таблица фактов, которая соединяется с таблицами справочниками по нескольким полям. При этом в таблице-фактов эти поля не всегда имеют конкретное значение, бывает, что там проставлен null.

Пример :
Таблица фактов(F):



Поле1 Поле2 поле3 поле4 Дата Значениеааа ввв ыыы ффф 01.01.2020 10ааа ппп ыыы ффф 01.01.2020 12ааа ввв ыыы ффф 02.01.2020 21ааа ввв null null 02.01.2020 2

Таблица справочник(S):
ID Поле1 Поле2 поле3 поле40 null null null null1 ааа ввв ыыы ффф2 ааа ппп ыыы ффф3 ааа ввв null null

Если запрос будет написан так:
Код: sql
1.
2.
Select isnull(s.id,0) as id, f.Значение, f.Дата from F
Left join S on f.поле1=s.поле1 and f.поле2=s.поле2 and f.поле3=s.поле3 and f.поле4=s.поле4 


, то 4 строка привяжется к Id=0, а не 3
Любое из полей может принять значение null. Делала такую связку
Код: sql
1.
isnull(f.поле1,'')=isnull(s.поле1,'') and isnull(f.поле2,'')=isnull(s.поле2,'') and isnull(f.поле3,'')=isnull(s.поле3,'') and isnull(f.поле4,'')=isnull(s.поле4,'')


При большом количестве связок запрос работает намного медленнее.

Возможно есть более производительный способ?

P.S. я знаю, что это ужасный способ связи таблиц, но по-другому никак.
...
Рейтинг: 0 / 0
Join по нескольким полям с null
    #39954751
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lania,

так не бывает, таблицы связываются по ключам, а ключ не может быть null значением или иметь в составе null атрибуты. Вы своим запросом получаете что-то среднепотолочное. Скорее всего из-за того, что справочники сведены в денормализованную таблицу. То, что вы называете "справочником" необходимо подвергнуть нормализации, разложить по таблицам, или обращаться к исходным таблицам этой "простыни", если такие есть. В этом случае запрос будет выглядеть и работать весьма прозрачно.
...
Рейтинг: 0 / 0
Join по нескольким полям с null
    #39954754
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lania,

я бы не стеснялся написать простыню

Код: sql
1.
2.
3.
(f.поле1=s.поле1 OR (f.поле1 IS NULL AND s.поле1 IS NULL)) AND 
(f.поле2=s.поле2 OR (f.поле2 IS NULL AND s.поле2 IS NULL)) AND 
....
...
Рейтинг: 0 / 0
Join по нескольким полям с null
    #39954756
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Lania,

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


Гавноданные в наше время явление распространенное и работать с ними надо тоже уметь ....
...
Рейтинг: 0 / 0
Join по нескольким полям с null
    #39954759
Lania
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_voronin, спасибо.
Проверю насколько быстро будет работать такая конструкция.
...
Рейтинг: 0 / 0
Join по нескольким полям с null
    #39954767
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

Я за нормализацию :) Типовая ETL, в общем-то.
...
Рейтинг: 0 / 0
Join по нескольким полям с null
    #39954770
Lania
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов, Вы не представляете как я "ЗА"!=)) Но работаем с тем, что есть.
...
Рейтинг: 0 / 0
Join по нескольким полям с null
    #39954800
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
так не бывает, таблицы связываются по ключам, а ключ не может быть null значением или иметь в составе null атрибуты.
Так бывает. Ссылаться можно на ключ, по полям которого есть уникальный индекс.
Например, это может быть UNIQUE CONSTRAINT, как известно, допускающий UNIQUE в полях
...
Рейтинг: 0 / 0
Join по нескольким полям с null
    #39954931
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,

Unique это же не ключ. В частном случае - кандидат.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Join по нескольким полям с null
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]