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

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

Есть таблица фактов, которая соединяется с таблицами справочниками по нескольким полям. При этом в таблице-фактов эти поля не всегда имеют конкретное значение, бывает, что там проставлен 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
06.05.2020, 18:32
    #39954751
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join по нескольким полям с null
Lania,

так не бывает, таблицы связываются по ключам, а ключ не может быть null значением или иметь в составе null атрибуты. Вы своим запросом получаете что-то среднепотолочное. Скорее всего из-за того, что справочники сведены в денормализованную таблицу. То, что вы называете "справочником" необходимо подвергнуть нормализации, разложить по таблицам, или обращаться к исходным таблицам этой "простыни", если такие есть. В этом случае запрос будет выглядеть и работать весьма прозрачно.
...
Рейтинг: 0 / 0
06.05.2020, 18:37
    #39954754
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join по нескольким полям с null
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
06.05.2020, 18:38
    #39954756
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join по нескольким полям с null
Владислав Колосов
Lania,

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


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

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

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


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