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




サブクエリ group by (4)

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

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から行を与えてください。

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

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'

しかし、サブクエリから複数の列を使用する正しい構文は何ですか(私の場合はトップ1のサブクエリを選択します)。 どうもありがとうございました。


あなたは参加する必要があります:

SELECT A.SalesOrderID, B.Foo
FROM A
JOIN B bo ON bo.id = (
     SELECT TOP 1 id
     FROM B bi
     WHERE bi.SalesOrderID = a.SalesOrderID
     ORDER BY bi.whatever
     )
WHERE A.Date BETWEEN '2000-1-4' AND '2010-1-4'

b.idB PRIMARY KEYであると仮定して

MS SQL 2005以降では、次の構文を使用できます。

SELECT SalesOrderID, Foo
FROM (
  SELECT A.SalesOrderId, B.Foo,
         ROW_NUMBER() OVER (PARTITION BY B.SalesOrderId ORDER BY B.whatever) AS rn
  FROM A
  JOIN B ON B.SalesOrderID = A.SalesOrderID
  WHERE A.Date BETWEEN '2000-1-4' AND '2010-1-4'
) i
WHERE rn

これは、各SalesOrderId Bからのレコードを1つだけ選択します。


SELECT
    T1.PrimaryKey,
    T1.SomeColumn,
    MySubQuery.Col1,
    MySubQuery.Col2,
    MySubQuery.Col3
From
    Table1 T1
    LEFT JOIN (SELECT TOP 1 Col1, Col2, Col3, Fkey FROM Table 2 ORDER BY Col1 DESC) AS MySubQuery ON T1.PrimaryKey = MySubQuery.Fkey

私はそれがあなたが望むものだと思う。

SELECT 
      A.SalesOrderID, 
      A.OrderDate, 
      FooFromB.*

FROM A,
     (SELECT TOP 1 B.Foo
      FROM B
      WHERE A.SalesOrderID = B.SalesOrderID
      ) AS FooFromB

WHERE A.Date BETWEEN '2000-1-4' AND '2010-1-4'




sql