반응형
기본 쿼리의 각 레코드에 대해 하나의 레코드 (상위 1 개 선택)가 있어야하는 하위 쿼리 (SQL Server)에서 여러 열을 선택하려면 어떻게해야합니까? [복제]
이 질문에 이미 답변이 있습니다.
- 각 그룹의 상위 1 개 행 가져 오기 18 개의 답변
다음 구문을 사용하여 하위 쿼리에서 열을 선택할 수 있다는 것을 알고 있습니다.
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,
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의 최대 값과 Foo2의 최대 값이 아닌 Foo에 대해 가장 높은 값을 가진 행에서 값을 가져 오는 것이라면 일반적으로 다음이 더 잘 작동합니다. 하위 쿼리 :
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
You're basically saying, give me the row from B where I can't find any other row from B with the same SalesOrderID and a greater Foo.
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'
You'll have to make a join:
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'
, assuming that b.id
is a PRIMARY KEY
on B
In MS SQL 2005
and higher you may use this syntax:
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
This will select exactly one record from B
for each SalesOrderId
.
i think that is what you want.
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'
select t1.*, sq.*
from table1 t1,
(select a,b,c from table2 ...) sq
where ...
반응형
'Programing' 카테고리의 다른 글
ECMAScript 6 클래스의 게터와 세터는 무엇입니까? (0) | 2020.08.25 |
---|---|
ngRepeat '추적 기준'표현식 이해 (0) | 2020.08.25 |
Cocoa의 기본 유형과 함께 performSelector : withObject : afterDelay :를 사용하는 방법? (0) | 2020.08.25 |
문자열에 대한 정규식에 포함됩니까? (0) | 2020.08.25 |
unset 사용 vs. 변수를 비워두기 (0) | 2020.08.25 |