복붙노트

[SQL] 어떻게하면 메인 쿼리의 각 레코드에 대해 하나 개의 레코드 (선택 상위 1)을 가져야한다 (SQL 서버)에 하위 쿼리에서 여러 열을 선택할 수 있습니다? [복제]

SQL

어떻게하면 메인 쿼리의 각 레코드에 대해 하나 개의 레코드 (선택 상위 1)을 가져야한다 (SQL 서버)에 하위 쿼리에서 여러 열을 선택할 수 있습니다? [복제]

나는이 구문을 사용하여 하위 쿼리에서 열을 선택할 수 있습니다 알고 :

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 하위 쿼리에서) 하위 쿼리에서 여러 열을 사용하는 올바른 구문은 무엇인가? 대단히 감사합니다.

해결법

  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
    

    당신이 궁극적으로 어떻게하려고하는 것은 푸 가장 높은 값을 가진 행의 값을 얻을 경우 (오히려 푸의 최대 및 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에와 더 푸와 B에서 다른 행을 찾을 수 없습니다 B에서 행을주고, 말을하는지.

  2. ==============================

    2.

    SELECT a.salesorderid, a.orderdate, s.orderdate, s.salesorderid
    FROM A a
    OUTER APPLY (SELECT top(1) *
                 FROM B b WHERE a.salesorderid = b.salesorderid) as s
    WHERE A.Date BETWEEN '2000-1-4' AND '2010-1-4'
    
  3. ==============================

    3.당신은 가입하게해야합니다 :

    당신은 가입하게해야합니다 :

    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.id 가정하면 B에 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에서 정확히 하나의 레코드를 선택합니다.

  4. ==============================

    4.나는 당신이 원하는 것을 생각합니다.

    나는 당신이 원하는 것을 생각합니다.

    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'
    
  5. ==============================

    5.

    select t1.*, sq.*
    from table1 t1,
       (select a,b,c from table2 ...) sq
    where ...
    
  6. from https://stackoverflow.com/questions/583954/how-can-i-select-multiple-columns-from-a-subquery-in-sql-server-that-should-ha by cc-by-sa and MIT license