@ IDList1 및 @ IDList2가 쉼표로 구분 된 문자열 인 경우,이 쿼리는 전혀 작동하지 않습니다. 테이블 변수 인 경우 IN 변수가 작동하도록 테이블 변수에서 SELECT를 가져야합니다.
공개 포럼에 질문을 올리므로 무고한 사람을 보호하기 위해 테이블 이름과 열 이름이 변경되기를 바랍니다. 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"과 많이 다릅니다. 첫 번째 구문 분석하지 않습니다. –