メインクエリの各レコードに対して 1 つのレコード (上位 1 つを選択) を持つサブクエリ (SQL Server) から複数の列を選択するにはどうすればよいですか? [重複] 質問する

メインクエリの各レコードに対して 1 つのレコード (上位 1 つを選択) を持つサブクエリ (SQL Server) から複数の列を選択するにはどうすればよいですか? [重複] 質問する

次の構文を使用してサブクエリから列を選択できることはわかっています。

SELECT A.SalesOrderID, A.OrderDate,
       (
       SELECT TOP 1 B.Foo
       FROM B
       WHERE A.SalesOrderID = B.SalesOrderID
       ) AS FooFromB
FROM A
WHERE A.Date BETWEEN '2000-1-4' AND '2010-1-4'

しかし、サブクエリ (私の場合は、select top 1 サブクエリ) から複数の列を使用するための正しい構文は何でしょうか? ありがとうございます。

ベストアンサー1

サブクエリから複数の列を選択する一般的な方法は次のとおりです。

SELECT
     A.SalesOrderID,
     A.OrderDate,
     SQ.Max_Foo,
     SQ.Max_Foo2
FROM
     A
LEFT OUTER JOIN
     (
     SELECT
          B.SalesOrderID,
          MAX(B.Foo) AS Max_Foo,
          MAX(B.Foo2) AS Max_Foo2
     FROM
          B
     GROUP BY
          B.SalesOrderID
     ) AS SQ ON SQ.SalesOrderID = A.SalesOrderID

最終的に Foo の最大値を持つ行から値を取得しようとしている場合 (Foo の最大値と Foo2 の最大値ではなく、これらは同じではありません)、通常はサブクエリよりも次の方法の方が適しています。

SELECT
     A.SalesOrderID,
     A.OrderDate,
     B1.Foo,
     B1.Foo2
FROM
     A
LEFT OUTER JOIN B AS B1 ON
     B1.SalesOrderID = A.SalesOrderID
LEFT OUTER JOIN B AS B2 ON
     B2.SalesOrderID = A.SalesOrderID AND
     B2.Foo > B1.Foo
WHERE
     B2.SalesOrderID IS NULL

基本的には、SalesOrderID が同じで Foo が大きい他の行が B に見つからない行を B から取得するように言っていることになります。

おすすめ記事