집 >데이터 베이스 >MySQL 튜토리얼 >SQL Server의 JOIN 조건에 CASE 문을 사용할 수 있나요?
SQL Server JOIN 및 CASE 문: 일반적인 함정
SQL Server 2008 R2(및 이후 버전)에서는 조인 기준을 정의하기 위해 CASE
조건 내에서 직접 JOIN
문을 사용하려고 하면 구문 오류가 발생할 수 있습니다. 이 문제가 발생하는 이유와 해결 방법을 살펴보겠습니다.
sys.partitions
값에 따라 조인이 달라지는 sys.allocation_units
과 sys.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>
이로 인해 "'=' 근처의 구문이 잘못되었습니다."라는 오류가 발생합니다. 문제는 CASE
표현식 자체가 조인 조건에 적합한 부울(TRUE/FALSE) 결과를 생성하지 않는다는 것입니다. 대신 a.container_id = p.hobt_id
또는 a.container_id = p.partition_id
중 하나를 반환하며 둘 다 그 자체로는 유효한 조인 조건이 아닙니다.
올바른 접근 방식: 부울 평가
이 문제를 해결하려면 부울 값을 생성하는 CASE
표현식이 필요합니다. true인 경우 1, false인 경우 0을 반환하도록 CASE
문을 구성한 다음 결과를 1:
<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>
이제 CASE
문은 적절한 조건(a.type
기반)과 동등성 검사(a.container_id = p.hobt_id
또는 a.container_id = p.partition_id
)가 모두 참인 경우에만 1로 평가됩니다. 그런 다음 = 1
비교는 JOIN
조건에 필요한 부울 결과를 제공합니다. 이 수정된 쿼리는 테이블을 올바르게 조인합니다. 이 방법을 사용하면 JOIN
조건이 참 또는 거짓 값으로 평가되어 조인이 의도한 대로 작동할 수 있습니다.
위 내용은 SQL Server의 JOIN 조건에 CASE 문을 사용할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!