powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Соединять таблицы left join пока не будет положительное значение
6 сообщений из 6, страница 1 из 1
Соединять таблицы left join пока не будет положительное значение
    #40093941
Диана Орел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версия СУБД Microsoft SQL Server 2012 (SP4-OD) (KB4091266) - 11.0.7469.6 (X64)

есть 2 таблицы, 2 иерархии. Их надо сопоставить. Они немного отличаются, не все элементы есть как в одно, так и в другой иерархии.
первая таблица содержит столбцы col_id, col_prn_id, level. вторая таблица содержит столбцы row_id, row_col_id.
соединяются они так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select col_id, coalesce(tab_r.row_id,tab_r1.row_id, tab_r2.row_id, tab_r3.row_id,...,tab_r8.row_id), level from colls tab_c
left join rows tab_r on tab_r.row_col_id = tab_c.col_id and tab_c.level = 1
left join rows tab_r1 on tab_r1.row_col_id = tab_c.col_prn_id and tab_c.level = 1
left join rows tab_r2 on tab_r2.rows_col_id = tab_c.col_prn_id and tab_c.level = 2
left join rows tab_r3 on tab_r3.rows_col_id = tab_c.col_prn_id and tab_c.level = 3
...
left join rows tab_r8 on tab_r8.rows_col_id = tab_c.col_prn_id and tab_c.level = 8



максимальное кол-во level = 8, но у каждого col_id может быть меньше 8 максимальный level.
мне надо написать запрос или процедуру или рекурсию, которая делает left join с таблицей colls до тех пор, пока tab_rn.row_id is null. То есть соединять до первого положительного (включительно)row_id. Всегда найдется хотя бы 1 положительный row_id.
Результат запроса прикрепила
...
Рейтинг: 0 / 0
Соединять таблицы left join пока не будет положительное значение
    #40093943
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диана Орел
максимальное кол-во level = 8,
если level ограничен, то 8-м left join + coalesce вполне вариант
...
Рейтинг: 0 / 0
Соединять таблицы left join пока не будет положительное значение
    #40093946
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диана Орел,

не хватает выборки distinct col_id, т.е. ключа. С этой выборкой и соединяйте left join подзапросы по уровням вложенности.

key, coalesce(lvl1value, lvl2value, ..., lvlNvalue) FirstFoundValue
...
Рейтинг: 0 / 0
Соединять таблицы left join пока не будет положительное значение
    #40093962
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диана Орел
То есть соединять до первого положительного (включительно)row_id. Всегда найдется хотя бы 1 положительный row_id.


Бред, канешно, знатный.
Но если "Всегда найдется хотя бы 1 положительный row_id"

Код: sql
1.
2.
3.
select col_id, r.row_id, c.level 
  from rows as r
       cross apply ( select top(1) * from colls as c where r.row_col_id = c.col_prn_id order by c.level asc ) as c
...
Рейтинг: 0 / 0
Соединять таблицы left join пока не будет положительное значение
    #40093963
Диана Орел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,
таблица на проме большая 500 тыс записей. Не у всех есть 8 уровней, у многих меньше. И первое положительное число наступит раньше, чем 8 уровень.
...
Рейтинг: 0 / 0
Соединять таблицы left join пока не будет положительное значение
    #40093968
Диана Орел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
Диана Орел
То есть соединять до первого положительного (включительно)row_id. Всегда найдется хотя бы 1 положительный row_id.


Бред, канешно, знатный.
Но если "Всегда найдется хотя бы 1 положительный row_id"

Код: sql
1.
2.
3.
select col_id, r.row_id, c.level 
  from rows as r
       cross apply ( select top(1) * from colls as c where r.row_col_id = c.col_prn_id order by c.level asc ) as c


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


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