powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Аналог Full Outer Join для соединения табличных функций
16 сообщений из 16, страница 1 из 1
Аналог Full Outer Join для соединения табличных функций
    #38320543
McCar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищи, помогите устранить пробел в знании T-SQL синтаксиса.
Задача выражается следующим кодом.
Код: sql
1.
2.
3.
4.
select coalesce(tf.ID, tf2.ID) as ID,  coalesce(tf.value, tf2.value) as value
 from SomeTableFunction(1) tf
outer apply 
(select * from SomeTableFunction(2)  where tf.ID is null /*если нет, то берем с другим аргументом*/) tf2


-- То есть логика такая - вывести значение некой таблично функции, если она ничего не выводит, то вывести значение это же функции с другим аргументом. Но - при таком синтаксисе эта логика не работает, если tf ничего не выводит, то и в результирующи набор ничего не попадет.
То есть "outer apply" нужно заменить на какой то иной оператор соединения, наподобие Full Outer Join.
Как?
...
Рейтинг: 0 / 0
Аналог Full Outer Join для соединения табличных функций
    #38320553
Мистер Хенки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
select tf.ID as ID,  tf.value as value
 from SomeTableFunction(1) tf
union all
select tf.ID as ID,  tf.value as value
 from SomeTableFunction(2) tf
where not exists(select 1 from  SomeTableFunction(1) )
...
Рейтинг: 0 / 0
Аналог Full Outer Join для соединения табличных функций
    #38320555
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где связь между tf и tf2?
...
Рейтинг: 0 / 0
Аналог Full Outer Join для соединения табличных функций
    #38320568
McCar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мистер Хенки
Код: sql
1.
2.
3.
4.
5.
6.
select tf.ID as ID,  tf.value as value
 from SomeTableFunction(1) tf
union all
select tf.ID as ID,  tf.value as value
 from SomeTableFunction(2) tf
where not exists(select 1 from  SomeTableFunction(1) )


А при таком синтаксисе SomeTableFunction(1) будет вызываться один раз или два?
...
Рейтинг: 0 / 0
Аналог Full Outer Join для соединения табличных функций
    #38320632
Мистер Хенки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
McCar,
два.
Еще можно через таблицу сделать
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
insert into @t (id,value)
select tf.ID as ID,  tf.value as value

 from SomeTableFunction(1) tf
if @@rowcount=0
insert into @t(id,value)
select tf.ID as ID,  tf.value as value
 from SomeTableFunction(2) tf
...
Рейтинг: 0 / 0
Аналог Full Outer Join для соединения табличных функций
    #38320638
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, так?
Код: sql
1.
2.
SELECT ID=ISNULL(F1.ID,F2.ID),value=CASE WHEN F1.ID IS NULL THEN F2.value ELSE F1.value END
FROM SomeTableFunction(1) F1 FULL JOIN SomeTableFunction(2) F2 ON F1.ID=F2.ID;
...
Рейтинг: 0 / 0
Аналог Full Outer Join для соединения табличных функций
    #38320661
McCar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мистер ХенкиMcCar,
два.
Еще можно через таблицу сделать
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
insert into @t (id,value)
select tf.ID as ID,  tf.value as value

 from SomeTableFunction(1) tf
if @@rowcount=0
insert into @t(id,value)
select tf.ID as ID,  tf.value as value
 from SomeTableFunction(2) tf


Не.. Multi-statement функции для меня не вариант, мне для олапной таблицы фактов, там производительность критична.
...
Рейтинг: 0 / 0
Аналог Full Outer Join для соединения табличных функций
    #38320686
RubinDm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
McCarМистер ХенкиMcCar,два.Еще можно через таблицу сделатьНе.. Multi-statement функции для меня не вариант, мне для олапной таблицы фактов, там производительность критична.иногда инлайны в план вписываются даже хуже, чем мульти-статменты.
...
Рейтинг: 0 / 0
Аналог Full Outer Join для соединения табличных функций
    #38320688
McCar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapМожет, так?
Код: sql
1.
2.
SELECT ID=ISNULL(F1.ID,F2.ID),value=CASE WHEN F1.ID IS NULL THEN F2.value ELSE F1.value END
FROM SomeTableFunction(1) F1 FULL JOIN SomeTableFunction(2) F2 ON F1.ID=F2.ID;


Тут не понял логику соединения "ON F1.ID=F2.ID".
Это условие никогда не выполнится.
А даже если выполнится, если одни из наборов пусто, результирующий тоже будет пустой
...
Рейтинг: 0 / 0
Аналог Full Outer Join для соединения табличных функций
    #38320708
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
McCariapМожет, так?
Код: sql
1.
2.
SELECT ID=ISNULL(F1.ID,F2.ID),value=CASE WHEN F1.ID IS NULL THEN F2.value ELSE F1.value END
FROM SomeTableFunction(1) F1 FULL JOIN SomeTableFunction(2) F2 ON F1.ID=F2.ID;



Тут не понял логику соединения "ON F1.ID=F2.ID".
Это условие никогда не выполнится.
А даже если выполнится, если одни из наборов пусто, результирующий тоже будет пустойКак Вы представляете себе FULL JOIN?
...
Рейтинг: 0 / 0
Аналог Full Outer Join для соединения табличных функций
    #38320736
McCar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapMcCarпропущено...

Тут не понял логику соединения "ON F1.ID=F2.ID".
Это условие никогда не выполнится.
А даже если выполнится, если одни из наборов пусто, результирующий тоже будет пустойКак Вы представляете себе FULL JOIN?
Ой...
Таки да.. загнался. :-)
...
Рейтинг: 0 / 0
Аналог Full Outer Join для соединения табличных функций
    #38320746
McCar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapМожет, так?
Код: sql
1.
2.
SELECT ID=ISNULL(F1.ID,F2.ID),value=CASE WHEN F1.ID IS NULL THEN F2.value ELSE F1.value END
FROM SomeTableFunction(1) F1 FULL JOIN SomeTableFunction(2) F2 ON F1.ID=F2.ID;


А так получается что функция в любом случае вызывается два раза.
Мне же нужно, чтобы с аргрументом =2 она вызывалась только в тех случаях, когда нет результатат для аргумента=1
...
Рейтинг: 0 / 0
Аналог Full Outer Join для соединения табличных функций
    #38320762
RubinDm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
use [tempdb]
go

create function dbo.someFunc(@argv int)
-- функция возвращает что-то только для значений @argv,
-- которые заведомо делятся нацело только на 3 (три).
returns table as return

select X.ID
from
( select ID = @argv * 10 + 1
  union all
  select ID = @argv * 10 + 2
  union all
  select ID = @argv * 10 + 3
) X
where @argv % 3 = 0
go

--select * from dbo.someFunc(1)
--select * from dbo.someFunc(2)
--select * from dbo.someFunc(3)
--select * from dbo.someFunc(4)
--select * from dbo.someFunc(5)
--select * from dbo.someFunc(6)
--select * from dbo.someFunc(7)
--select * from dbo.someFunc(8)

select top (1) with ties Func.[ID] -- , Func.AndOtherFields
from
( select argv = 1   union all
  select argv = 2   union all
  select argv = 3   union all
  select argv = 4   union all
  select argv = 5   union all
  select argv = 6   union all
  select argv = 7   union all
  select argv = 8
) args -- это возможные аргументы на входе
cross apply -- применяем args.argv к TFn
( select F.[ID] -- , F.AndOtherFields
  from dbo.someFunc(args.argv) F
) Func
order by args.argv asc -- сортируем по значению аргумента

drop function dbo.someFunc
go
...
Рейтинг: 0 / 0
Аналог Full Outer Join для соединения табличных функций
    #38320783
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
McCarМне нужно, чтобы с аргрументом =2 она вызывалась только в тех случаях, когда нет результатат для аргумента=1
Вызвали функцию с аргументом 1, она вернула таблицу (id, <value/null>), отобрали все ID для которых value is null. Вопрос - как передать в ту же самую функцию отобранные ID, если она их не требует при вызове (даже с аргументом 2)?
...
Рейтинг: 0 / 0
Аналог Full Outer Join для соединения табличных функций
    #38320802
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
McCarМистер ХенкиMcCar,
два.
Еще можно через таблицу сделать
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
insert into @t (id,value)
select tf.ID as ID,  tf.value as value

 from SomeTableFunction(1) tf
if @@rowcount=0
insert into @t(id,value)
select tf.ID as ID,  tf.value as value
 from SomeTableFunction(2) tf


Не.. Multi-statement функции для меня не вариант, мне для олапной таблицы фактов, там производительность критична.
получается выбор между multi-statement или дополнительным вызовом SomeTableFunction(). надо сравнивать
...
Рейтинг: 0 / 0
Аналог Full Outer Join для соединения табличных функций
    #38320888
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RubinDmиногда инлайны в план вписываются даже хуже, чем мульти-статменты.Ага, ага, прям таки это тот случай.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Аналог Full Outer Join для соединения табличных функций
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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