SQL 조인에서 관련 테이블의 첫 번째 행만 선택
데이터베이스 조인은 관련 테이블에서 일치하는 여러 행을 검색하는 경우가 많습니다. 이 문서에서는 일치 항목이 여러 개 존재하는 경우에도 조인을 상위 레코드당 단일 행으로 제한해야 하는 시나리오를 설명합니다. 이렇게 하면 쿼리 출력에서 중복 결과가 방지됩니다.
도전
두 개의 테이블 Orders
과 LineItems
을 생각해 보세요. 일반적으로 주문에는 하나의 품목이 있지만 일부 주문에는 여러 품목이 있을 수 있습니다. 주문 세부 정보를 표시할 때 주문당 하나의 품목만 표시하는 것이 중요합니다. 그렇지 않으면 중복으로 인해 결과가 복잡해집니다.
초기 접근(및 실패)
조인 내에서 TOP 1
을 사용하려는 순진한 시도는 내부 쿼리가 외부 테이블의 열(예: OrderID
)에 액세스할 수 없기 때문에 실패합니다.
해결책: CROSS APPLY 및 INNER JOIN
가장 효과적인 접근 방식은 CROSS APPLY
(SQL Server 2005 이상에서 사용 가능) 또는 이전 버전의 경우 영리한 INNER JOIN
을 사용하는 것입니다.
CROSS APPLY 사용(SQL Server 2005 이상)
CROSS APPLY
은 외부 테이블의 각 행에 대한 행 집합을 생성하여 상관 하위 쿼리를 활성화합니다. 그런 다음 이 하위 쿼리는 관련 테이블에서 단일 행을 필터링하고 선택합니다.
<code class="language-sql">SELECT Orders.OrderNumber, LineItems2.Quantity, LineItems2.Description FROM Orders CROSS APPLY ( SELECT TOP 1 LineItems.Quantity, LineItems.Description FROM LineItems WHERE LineItems.OrderID = Orders.OrderID ) LineItems2</code>
INNER JOIN 사용(SQL Server 2005 이전)
CROSS APPLY
이 없는 이전 SQL Server 버전의 경우 하위 쿼리가 있는 INNER JOIN
은 동일한 결과를 얻습니다.
<code class="language-sql">SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description FROM Orders INNER JOIN LineItems ON LineItems.LineItemGUID = ( SELECT TOP 1 LineItemGUID FROM LineItems WHERE OrderID = Orders.OrderID )</code>
결정론에 대한 중요 참고 사항:
TOP 1
절은 ORDER BY
절이 없으면 본질적으로 비결정적입니다. 일관된 결과를 보장하려면(예: 항상 동일 "첫 번째" 줄 항목 선택) 내부 쿼리 내에 ORDER BY
절을 추가하세요(예: ORDER BY LineItems.SomeColumn
). 이렇게 하면 예측 가능한 광고 항목 선택이 보장됩니다.
위 내용은 SQL에서 관련 테이블의 첫 번째 행에만 효율적으로 조인하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!