2013-02-16 5 views
2

연습 할당으로 조인을 select 절의 하위 쿼리로 다시 쓰려고합니다. select 문에있는 하위 쿼리가 단일 값을 반환해야한다는 것을 이해하고이 내용을 의미있는 방식으로 다시 작성하는 방법을 찾는 데 어려움을 겪고 있습니다.select 문에서 상관 된 하위 쿼리로 조인 쿼리 다시 설정

여기에 원래의 문을 결합이다 :

SELECT InvoiceNumber, InvoiceDate, InvoiceLineItemAmount 
FROM Invoices JOIN InvoiceLineItems 
    ON Invoices.InvoiceID = Invoicelineitems.InvoiceID 
WHERE VendorID = 122 
ORDER BY InvoiceDate 

어떤 조언, 도움이 많이 주시면 감사하겠습니다!

+2

테이블 정의 란 무엇입니까? 우리는 순간에 어느 테이블이 어떤 테이블에 속해 있는지 추측 할 필요가 있습니다. –

답변

1

내 도움말에는 기본 쿼리에 InvoiceLineItems가 있고 하위 쿼리에 송장이 있습니다. 이렇게하면 하위 쿼리가 정확히 한 행을 반환하게 될 가능성이 높아집니다.

+0

+1 관계가 많은 광고 항목에 대해 1 인보이스라고 가정하면이 방법이 효과적입니다. 'FROM Invoices'의 답변은 그렇지 않습니다. –

0

한 행보다 하위 쿼리의 경우에, 당신은 대신 ON 절 그냥 서브 쿼리의 WHERE 절에 조건을 배치를 사용하는 TOP 절을

SELECT InvoiceNumber, InvoiceDate, 
(
    SELECT InvoiceLineItemAmount 
    FROM InvoiceLineItems 
    WHERE Invoices.InvoiceID = Invoicelineitems.InvoiceID 
) AS InvoiceLineItemAmount 
FROM Invoices 
WHERE VendorID = 122 
ORDER BY InvoiceDate 
+0

당신이 쓴 것을 다시보고 싶습니까? "조인"이라는 단어 뒤에 무엇을 가지고 있는지주의 깊게 살펴보십시오. –

+0

ooops. 제거됨. –

1

이 필요합니다.

SELECT InvoiceNumber, InvoiceDate, 
     (SELECT InvoiceLineItemAmount 
     FROM InvoiceLineItems 
     WHERE Invoices.InvoiceID = Invoicelineitems.InvoiceID) 
      AS InvoiceLineItemAmount 
FROM Invoices 
WHERE VendorID = 122 
ORDER BY InvoiceDate 

하위 쿼리가 둘 이상의 값을 반환하면 몇 가지 옵션이 있습니다.

당신은 TOP 1

SELECT InvoiceNumber, InvoiceDate, 
     (SELECT TOP 1 InvoiceLineItemAmount 
     FROM InvoiceLineItems 
     WHERE Invoices.InvoiceID = Invoicelineitems.InvoiceID) 
      AS InvoiceLineItemAmount 
FROM Invoices 
WHERE VendorID = 122 
ORDER BY InvoiceDate 

당신은 집계 함수를

SELECT InvoiceNumber, InvoiceDate, 
     (SELECT MAX(InvoiceLineItemAmount) 
     FROM InvoiceLineItems 
     WHERE Invoices.InvoiceID = Invoicelineitems.InvoiceID) 
      AS InvoiceLineItemAmount 
FROM Invoices 
WHERE VendorID = 122 
ORDER BY InvoiceDate 

을 사용할 수 있습니다 잡을 수 또는 당신은 @MartinSmith에 대한 XML

SELECT InvoiceNumber, InvoiceDate, 
     STUFF((
      SELECT ', ' + LTRIM(InvoiceLineItemAmount) 
      FROM InvoiceLineItems 
      WHERE Invoices.InvoiceID = Invoicelineitems.InvoiceID 
      FOR XML PATH('')), 
      1, 2, '') AS InvoiceLineItemAmount 
FROM Invoices 
WHERE VendorID = 122 
ORDER BY InvoiceDate 

또는를 사용하여 결과를 연결할 수 있습니다, 당신은 관계를 되돌리고 대신 InvoiceLineItems에서 멈출 수 있습니다. 스키마 제한을 모르면 동일한 returns more than one value 문제가 발생할 수 있습니다.

SELECT (SELECT InvoiceNumber 
     FROM InvoiceLineItems 
     WHERE Invoices.InvoiceID = Invoicelineitems.InvoiceID) 
      AS InvoiceNumber, 
     (SELECT InvoiceDate 
     FROM InvoiceLineItems 
     WHERE Invoices.InvoiceID = Invoicelineitems.InvoiceID) 
      AS InvoiceDate 
     InvoiceLineItemAmount 
FROM InvoiceLineItems 
WHERE VendorID = 122 
ORDER BY InvoiceDate 

결국 모든 요구 사항에 따라 다릅니다.

+0

많은 옵션이 있지만 기본 쿼리는'FROM InvoiceLineItems'이고, 상관 쿼리는'FROM Invoices'입니다. 그런 식으로'InvoiceID'가'Invoices'의 PK이고 외래 키를 방지하는 고아 항목이 있다고 가정 할 때 정확히 일치하는 행이 하나만있을 수 있습니다. –

+0

+1 나는 'Invoices' 테이블이 동일한'InvoiceID '를 가진 하나 이상의 행을 가질 것 같지 않다는 추측을 할 수 있다고 생각합니다. –

+0

꽤 좋은 가정이라고 생각합니다. 그러나 나는 거기서 더 미친 것들을 보았습니다. 야생. – pyrospade

관련 문제