2

演習課題として、select 句で結合をサブクエリとして書き直そうとしています。selectステートメントのサブクエリは単一の値を返さなければならないことを理解していますが、これを意味のある方法で書き直す方法を理解するのに苦労しています。

元の結合ステートメントは次のとおりです。

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

ヒントや支援をいただければ幸いです。

4

3 に答える 3

1

私のヒントは、メイン クエリに InvoiceLineItems を、サブクエリに Invoices を含めることです。これにより、サブクエリが正確に 1 行を返す可能性が高くなります。

于 2013-02-16T23:04:15.847 に答える
1

句を使用する代わりに、サブクエリONの句に条件を配置するだけです。WHERE

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

または、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

または、@MartinSmith の場合は、関係を逆にして、代わりに 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

結局、それはすべてあなたの要件が何であるかに依存します.

于 2013-02-16T23:05:39.370 に答える
0

サブクエリで複数の行がある場合は、TOP句が必要です

SELECT InvoiceNumber, InvoiceDate, 
 (
  SELECT InvoiceLineItemAmount
  FROM InvoiceLineItems
  WHERE Invoices.InvoiceID = Invoicelineitems.InvoiceID
  ) AS InvoiceLineItemAmount 
FROM Invoices
WHERE VendorID = 122
ORDER BY InvoiceDate
于 2013-02-16T23:04:22.657 に答える