SQL Server JOIN 조건 및 CASE 문: 자세히 살펴보기
sys.partitions
및 sys.allocation_units
과 같은 Microsoft SQL Server 2008 R2의 시스템 뷰로 작업할 때 이들 간의 관계는 sys.allocation_units.type
값에 따라 달라지는 경우가 많습니다. 이러한 테이블을 조인하는 일반적인 접근 방식은 CASE
조건JOIN
내의
이 시나리오를 살펴보겠습니다. sys.indexes
, sys.partitions
및 sys.allocation_units
을 연결하려면 allocation_units.type
을 기반으로 하는 조건부 조인이 필요합니다. 초기 시도는 다음과 같습니다.
<code class="language-sql">SELECT * FROM sys.indexes i JOIN sys.partitions p ON i.index_id = p.index_id JOIN sys.allocation_units a ON CASE WHEN a.type IN (1, 3) THEN a.container_id = p.hobt_id WHEN a.type IN (2) THEN a.container_id = p.partition_id END</code>
그러나 이로 인해 구문 오류가 발생합니다. 문제는 SQL Server의 CASE
문이 실행 가능한 문이 아닌 스칼라 값을 생성한다는 사실에서 비롯됩니다. JOIN
절 내에서 동등 비교를 직접 제어할 수는 없습니다.
해결책: CASE를 사용한 부울 평가
이 문제를 해결하려면 비교 가능한 부울 값(참의 경우 1, 거짓의 경우 0)을 반환하도록 CASE
문을 재구성해야 합니다.
<code class="language-sql">SELECT * FROM sys.indexes i JOIN sys.partitions p ON i.index_id = p.index_id JOIN sys.allocation_units a ON CASE WHEN a.type IN (1, 3) AND a.container_id = p.hobt_id THEN 1 WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1 ELSE 0 END = 1</code>
AND
절 내에서 WHEN
을 사용하고 결과 CASE
표현식을 1과 비교하여 조건부 조인을 효과적으로 생성합니다. 이는 CASE
문이 강력하기는 하지만 JOIN
조건 내에서 사용하려면 반환 유형과 명시적인 부울 평가의 필요성을 신중하게 고려해야 함을 보여줍니다. CASE
내 JOIN
문 자체 내에서 직접 할당이나 동일성 테스트는 지원되지 않습니다.
위 내용은 SQL Server의 JOIN 조건에서 CASE 문을 직접 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!