Для начала, если ваши @ IDList1 и @ IDList2 являются строками, разделенными запятой, этот запрос не будет работать вообще. Если они являются переменными таблицы, вам нужно иметь SELECT из переменных таблицы для работы IN.
Кроме того, поскольку вы публикуете это как вопрос на открытом форуме, я собираюсь надеяться, что имена таблиц и имена столбцов были изменены для защиты невинных. Имена столбцов t1_1, t1_2 и т. Д. Довольно ужасны, поскольку соглашение об именах идет.
Я думаю, что сначала не понял вопрос. Вот два возможных решения:
SELECT
T1.t1_1
FROM
T1
LEFT JOIN #t2 T2 ON
T2.t2_3 = T1.t1_3
WHERE
EXISTS
(
SELECT
ParsedValue
FROM
tf_ToTable(@IDList1)
WHERE
ParsedValue = ISNULL(T2.t2_1, 54)
) AND
EXISTS
(
SELECT
ParsedValue
FROM
tf_ToTable(@IDList2)
WHERE
ParsedValue = ISNULL(T2.t2_2, 97)
)
Или, если это в конкретном случае ищет значения в строку с разделителями:
SELECT
T1.t1_1
FROM
T1
LEFT JOIN #t2 T2 ON
T2.t2_3 = T1.t1_3
WHERE
',' + @IDList1 + ',' LIKE '%,' + CAST(ISNULL(T2.t2_1, 54) AS VARCHAR) + ',%' AND
',' + @IDList2 + ',' LIKE '%,' + CAST(ISNULL(T2.t2_2, 97) AS VARCHAR) + ',%'
Этот последний запрос предполагает, что вы используете запятую как ваш разделитель и что в строке нет пробела. Вы можете использовать функцию REPLACE, чтобы избавиться от пробелов в строке, если вам нужно это сделать.
Вы хотите иметь ISNULL (t2.t2_1, 54) и ISNULL (t2.t2_2, 97)? –
Да, они были намеренно помещены туда. Как я уже упоминал в своем оригинальном посте, одна из первых вещей, которые я сделаю, - установить эти столбцы не null и их соответствующее значение по умолчанию. Мой главный вопрос: как я могу реструктурировать соединение, чтобы не было предложений WHERE IN. Вы можете игнорировать IS NULL с точки зрения настройки, если это вам поможет –
Это не вопрос настройки. Это вопрос «IS NULL», сильно отличающийся от «ISNULL». Первый даже не будет разбираться. –