IT

조건부 JOIN 문 SQL Server

itgroup 2023. 6. 27. 22:05
반응형

조건부 JOIN 문 SQL Server

다음 작업을 수행할 수 있습니까?

IF [a] = 1234 THEN JOIN ON TableA 
ELSE JOIN ON TableB

그렇다면 올바른 구문은 무엇입니까?

다음을 사용하여 초기 테이블을 Option_A와 Option_B에 모두 연결하면 요청하신 내용이 작동할 것이라고 생각합니다.LEFT JOIN이는 다음과 같은 것을 만들어 낼 것입니다.

Initial LEFT JOIN Option_A LEFT JOIN NULL
OR
Initial LEFT JOIN NULL LEFT JOIN Option_B

코드 예제:

SELECT i.*, COALESCE(a.id, b.id) as Option_Id, COALESCE(a.name, b.name) as Option_Name
FROM Initial_Table i
LEFT JOIN Option_A_Table a ON a.initial_id = i.id AND i.special_value = 1234
LEFT JOIN Option_B_Table b ON b.initial_id = i.id AND i.special_value <> 1234

이렇게 하면 NULLs 집합을 '무시'할 수 있습니다.여기서 추가적인 트릭은 NULL 필드로 수행할 작업을 결정해야 하는 SELECT 행에 있습니다.Option_A 및 Option_B 테이블이 유사한 경우 다음을 사용할 수 있습니다.COALESCE함수를 사용하여 첫 번째 NON NULL 값을 반환합니다(예:

다른 옵션은 Option_A 필드와 Option_B 필드를 나열하고 사용 중인 모든 필드를ResultSet사용할 필드를 결정합니다.

이는 쿼리가 조건에 따라 동적으로 구성될 수 있다는 점을 추가하기 위한 것입니다.아래에 예가 제시되어 있습니다.

DECLARE @a INT = 1235
DECLARE @sql VARCHAR(MAX) = 'SELECT * FROM [sourceTable] S JOIN ' + IIF(@a = 1234,'[TableA] A ON A.col = S.col','[TableB] B ON B.col = S.col') 

EXEC(@sql)
--Query will be
/*
SELECT * FROM [sourceTable] S JOIN [TableB] B ON B.col = S.col
*/

당신은 이것을 연합으로 해결할 수 있습니다.

select a, b
from tablea
join tableb on tablea.a = tableb.a
where b = 1234
union
select a, b
from tablea
join tablec on tablec.a = tableb.a
where b <> 1234

저는 2개의 왼쪽 조인을 제안하는 해결책에 반대합니다.테이블 값 함수가 더 적합하다고 생각합니다. 따라서 각 조건에 대한 모든 병합 및 추가 조인이 없습니다.

CREATE FUNCTION f_GetData (
    @Logic VARCHAR(50)
) RETURNS @Results TABLE (
    Content VARCHAR(100)
) AS
BEGIN
    IF @Logic = '1234'
        INSERT @Results
            SELECT Content
            FROM Table_1
    ELSE
        INSERT @Results
            SELECT Content
            FROM Table_2
    RETURN
END
GO

SELECT *
FROM InputTable
    CROSS APPLY f_GetData(InputTable.Logic) T

저는 당신의 질문을 다른 방식으로 생각하고 그것들을 세트처럼 다루는 것이 좋을 것이라고 생각합니다.

저는 당신이 두 개의 별도 쿼리를 만든 후 유니온을 사용하여 쿼리에 참여하면 성능이 훨씬 향상되고 가독성이 향상될 것이라고 생각합니다.

언급URL : https://stackoverflow.com/questions/26518526/conditional-join-statement-sql-server

반응형