>데이터 베이스 >MySQL 튜토리얼 >SQL에서 관련 테이블의 첫 번째 행에 효율적으로 조인하는 방법은 무엇입니까?

SQL에서 관련 테이블의 첫 번째 행에 효율적으로 조인하는 방법은 무엇입니까?

DDD
DDD원래의
2025-01-17 06:18:09597검색

How to Efficiently Join to the First Row of a Related Table in SQL?

SQL에서 관련 테이블의 첫 번째 행만 선택

많은 데이터세트에는 관련 테이블의 여러 항목이 포함된 행이 포함되어 있습니다. 이러한 테이블을 효율적으로 조인하려면 데이터 중복을 방지하는 전략이 필요합니다. 이 문서에서는 기본 테이블의 각 항목에 대해 관련 테이블의 첫 번째 행만 조인하는 방법을 보여줍니다.

과제: 중복 조인 방지

관련 테이블에 단일 주문 ID에 대한 여러 항목이 있는 경우 단순 조인을 통해 각 주문에 대해 여러 행이 생성될 수 있습니다. 해당하는 첫 번째 행만 선택하는 방법이 필요합니다.

비효과적인 접근 방식: TOP 1 함정

내부 쿼리가 외부 테이블의 열(예: TOP 1)에 액세스할 수 없기 때문에 내부 선택 내에서 OrderID을 사용하는 순진한 시도는 실패합니다.

효과적인 솔루션: 검증된 두 가지 방법

원하는 결과를 얻을 수 있는 두 가지 신뢰할 수 있는 방법:

1. 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>

2. INNER JOIN(2005년 이전 SQL Server 버전의 경우):

이전 SQL Server 버전의 경우 하위 쿼리가 있는 INNER JOIN은 동일한 결과를 얻습니다.

<code class="language-sql">SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM Orders
JOIN LineItems
ON LineItems.LineItemGUID =
(
    SELECT TOP 1 LineItemGUID
    FROM LineItems
    WHERE OrderID = Orders.OrderID
)</code>

두 방법 모두 TOP 1를 활용하여 LineItems에서 첫 번째로 일치하는 행만 선택합니다. 이렇게 하면 데이터 중복이 제거됩니다.

결정적인 결과 보장

결정적으로 내부 ORDER BY 문 내에 SELECT 절이 없으면 "첫 번째" 행은 임의적입니다. 동일한 데이터라도 쿼리를 실행하면 서로 다른 결과가 반환될 수 있습니다. 일관되고 예측 가능한 결과를 보장하려면 항상 내부 쿼리에 ORDER BY 절을 포함하세요. 예:

<code class="language-sql">SELECT TOP 1 LineItems.Quantity, LineItems.Description
FROM LineItems
WHERE LineItems.OrderID = Orders.OrderID
ORDER BY LineItems.SomeColumn  -- Add a column to order by</code>

이러한 기술을 보여주는 SQLfiddle 예제를 사용할 수 있습니다(여기서 라이브 SQLfiddle 링크를 생성할 수 없으므로 링크 생략). 실제 사례는 온라인 리소스를 참조하세요.

위 내용은 SQL에서 관련 테이블의 첫 번째 행에 효율적으로 조인하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.