我有兩個我想加入的表
table1
----------------------------
Id Name Num
123X Apple 17
table2
-------------------------------------------------
id EndDt SomeVal
123X 10/1/2021 xxx
123X 3/1/2022 yyy
我從嘗試選擇table1 a和LEFT JOIN table2 b on a.id = b.id-不過,我想只有在表2其中ID選擇MAX(EndDt)
Select a.*, b.SomeVal
from table1 a
LEFT OUTER JOIN table2 b on a.id=b.id // and b.MAX(EndDt)
這樣的事情可行嗎?
uj5u.com熱心網友回復:
有幾種方法可以做到這一點。不過,我對您的資料做了一些假設。
- 將 a
LEFT JOIN與子查詢一起使用:SELECT T1.*, sq.SomeVal FROM dbo.Table1 T1 LEFT JOIN (SELECT ROW_NUMBER() OVER (PARTITION BY t2.Id ORDER BY t2.EndDt DESC) AS RN, t2.Id, t2.SomeVal FROM dbo.Table2 T2) sq ON T1.Id = T2.Id AND T2.RN = 1; - 使用
APPLY和TOP:SELECT T1.*, sq.SomeVal FROM dbo.Table1 T1 OUTER APPLY (SELECT TOP (1) t2.Id, t2.SomeVal FROM dbo.Table2 T2 WHERE T2.Id = T1.Id ORDER BY T2.EndDt DESC) sq; - 使用 CTE 并獲得每組的“前 1”行:
WITH CTE AS( SELECT T1.*, T2.SomeVal, ROW_NUMBER() OVER (PARTITION BY T1.ID ORDER BY T2.MaxDt DESC) AS RN FROM dbo.Table1 T1 LEFT JOIN dbo.Table2 T2 ON T1.Id = T2.Id) SELECT * FROM CT WHERE RN = 1; - 使用
TOP (1) WITH TIES:SELECT TOP (1) WITH TIES T1.*, T2.SomeVal FROM dbo.Table1 T1 LEFT JOIN dbo.Table2 T2 ON T1.Id = T2.Id ORDER BY ROW_NUMBER() OVER (PARTITION BY T1.ID ORDER BY T2.MaxDt DESC) ASC;
請注意,如果選項 3 和 4ID在表中不是唯一的,則選項 3 和 4 將不會按預期作業Table1(因此我對您的資料做出了假設)。
uj5u.com熱心網友回復:
我建議使用視窗化 ROW_NUMBER 函式先取最大值table2,然后加入該子查詢。
;WITH cte AS (
SELECT *, [Row] = ROW_NUMBER() OVER (PARTITION BY b.Id ORDER BY b.EndDt DESC)
FROM table2 b
)
SELECT a.*, cte.SomeVal
FROM table1 a
LEFT JOIN cte ON a.id = cte.id AND cte.[Row] = 1
uj5u.com熱心網友回復:
對于單個值,使用相關子查詢:
SELECT
a.id,
a.name,
a.num,
(
SELECT TOP 1 SomeValue
FROM table2 As b
WHERE b.id = a.id
ORDER BY b.EndDt DESC
) As SomeVal
FROM
table1 a
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/365545.html
標籤:sql sql-server 加入
