INNER JOIN с табличной функцией не работает

У меня есть функция с табличным значением, которая возвращает таблицу. Когда я пытаюсь JOIN выполнить возвращающую табличное значение функцию с другой таблицей, я не получаю никаких результатов, но когда я копирую результат функции в реальную таблицу и выполняю то же соединение, я получаю ожидаемые результаты.

Запрос выглядит примерно так:

Select *
From myTable
INNER JOIN fn_function(@parm1, @param2)
ON ....

Всего у меня около 4 таких запросов, и каждый из них имеет немного разные функции, но все функции создают одну и ту же таблицу, но разные данные. Для некоторых из этих запросов INNER JOIN работает, а для других - нет.

Есть предположения, почему это происходит?


person user2343837    schedule 01.05.2014    source источник
comment
Может быть что-то связано с несовпадающими типами данных. Вы можете показать нам настоящий код?   -  person dean    schedule 01.05.2014
comment
Будут полезны образцы данных и скрипт sql.   -  person Anup Agrawal    schedule 01.05.2014
comment
дайте точный запрос, чтобы помочь. Он должен работать. Обычно я даю псевдоним функции, например INNER JOIN fn_function(@param1, @param2) fn ON.... Точный запрос поможет найти решение.   -  person Roopesh    schedule 01.05.2014


Ответы (4)


С функцией табличного значения вы обычно используете Cross Apply.

Select *
From myTable m
CROSS APPLY fn_function(m.field1, m.field2)
person Anup Agrawal    schedule 01.05.2014
comment
Только если вы хотите передать что-то из внешнего запроса в функцию в качестве параметра. Что не относится к OP. - person dean; 01.05.2014
comment
но для этой функции требуются параметры. так что я могу заменить параметры соединяющими столбцами? - person user2343837; 01.05.2014
comment
Да, если это те же столбцы. - person Anup Agrawal; 01.05.2014
comment
@dean Кстати, что вы имеете в виду под OP? :) - person Anup Agrawal; 01.05.2014
comment
@AnupAgrawal - OP может использоваться для двух тесно связанных терминов, по моему опыту - Исходный пост (вопрос, который был задан) или Оригинальный постер (человек, задавший вопрос). Обычно из контекста можно сделать вывод, какой из них имелся в виду, или даже не имеет значения, какой из них имелся в виду. - person Damien_The_Unbeliever; 01.05.2014
comment
@AnupAgrawal Перекрестное применение функции приведет к тому, что она будет выполняться один раз для каждой строки во внешнем выборе, в отличие от присоединения к ней, которое выполняет ее только один раз. Вы не можете просто поменять их местами. А OP означает «оригинальный плакат». - person dean; 01.05.2014
comment
Я согласен с тобой @dean. Пакетная обработка в большинстве случаев лучше, чем обработка строк. Если 2 параметра не поступают от некоторых переменных и присоединяются к значению из mainTable, в этом случае я думаю, что нам нужно использовать Cross Apply. Я думаю, что мы не сможем двигаться дальше, если OP не предоставит больше информации. - person Anup Agrawal; 01.05.2014

Если мы сделаем некоторые предположения, что параметры функций с табличным значением не зависят от столбцов myTable динамически, это сработает.

   SELECT *
    FROM myTable 
    INNER JOIN

    (SELECT * from fn_function(@para1, @para2 etc))
 ON ...

но если параметры зависят от myTable, это не сработает

person user2343837    schedule 01.05.2014
comment
На самом деле это не отвечает на вопрос: вы просто показали более подробный способ сформулировать один и тот же результат, не объясняя, как разрешить вопрос, если параметры действительно зависят от каждой отдельной строки myTable. - person underscore_d; 28.11.2017

Ваше предложение "ON" соединения, скорее всего, неверно. Возможно небольшая опечатка вроде

ПРИСОЕДИНЯЙТЕСЬ x НА oID = odID

вместо того

ПРИСОЕДИНЯЙТЕСЬ x НА oID = oID

person nicko    schedule 17.02.2015
comment
Правильный ответ для меня. - person Ian Warburton; 07.08.2019

Я думаю это должно сработать

  Select * 
    From Animals 
    Join dbo.AnimalsTypesIds(900343) 
      As AnimalsTypes
      On AnimalsTypes.TypeId = Animals.TypeId

В функции с табличным значением возвращаемая таблица должна иметь TypeId, чтобы соединение работало с этим предложением.

person Nayas Subramanian    schedule 06.07.2017