[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.여기에 하위 쿼리에서 여러 열을 선택하는 방법 일반적이다 :
여기에 하위 쿼리에서 여러 열을 선택하는 방법 일반적이다 :
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.
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.당신은 가입하게해야합니다 :
당신은 가입하게해야합니다 :
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.나는 당신이 원하는 것을 생각합니다.
나는 당신이 원하는 것을 생각합니다.
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.
select t1.*, sq.* from table1 t1, (select a,b,c from table2 ...) sq where ...
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
'SQL' 카테고리의 다른 글
[SQL] 인덱스 대 고유 제한 조건을 POSTGRES (0) | 2020.05.31 |
---|---|
[SQL] 추가 된 문자열 CONCAT가 작동하지 필드에서 SQL UPDATE는 모든 값 (0) | 2020.05.31 |
[SQL] MySQL은 한 두 개의 열 인덱스 대 두 단일 열 인덱스? (0) | 2020.05.31 |
[SQL] 읽을 수있는 / 계층 적 형식으로 배열을 표시 (0) | 2020.05.31 |
[SQL] SQL에서 뷰의 차이 및 테이블 (0) | 2020.05.31 |