SQL:左联接,但只选择一行创建日期最少的行
假设我有这张桌子: 表A:SQL:左联接,但只选择一行创建日期最少的行,sql,sql-server,tsql,join,greatest-n-per-group,Sql,Sql Server,Tsql,Join,Greatest N Per Group,假设我有这张桌子: 表A: id name --- --- 1 John 表B: id content Aid Date --- --- --- ---------- 100 abc 1 2017-02-03 11:16:00 101 xyz 1 2017-02-03 11:50:00 我想连接A和B,这样生成的表只有B中日期
id name
--- ---
1 John
表B:
id content Aid Date
--- --- --- ----------
100 abc 1 2017-02-03 11:16:00
101 xyz 1 2017-02-03 11:50:00
我想连接A和B,这样生成的表只有B中日期为最小值的一行
我的期望输出:
id name content
--- --- ------
1 John abc
我加入的失败尝试也给了我1,John,xyz行:
SELECT A.[id], A.[name], B.[content]
FROM A
LEFT JOIN B
ON A.id = B.Aid
后来我尝试了一个WHERE-inside连接,但我无法构造它:
SELECT A.[id], A.[name]
FROM A
LEFT JOIN B
ON A.id = (SELECT Aid FROM B WHERE Date = (SELECT MIN(Date) FROM B
WHERE <no idea where I'm going?>)
有人能给我指一下正确的方向吗?为什么不使用“按B顺序选择TOP 1”。日期描述?您可以使用到派生表的左联接:
SELECT A.[id], A.[name],B.[content]
FROM A
LEFT JOIN B
ON A.id = B.Aid
AND B.Date = (Select Min(Date) from B as B2 where B2.Aid=A.id)
SELECT a.ID, a.Name, b.Content
FROM a
LEFT JOIN
(
SELECT aId, content, ROW_NUMBER() OVER (PARTITION BY aId ORDER BY Date) rn
FROM b
) b ON(a.Id = b.AId AND b.rn = 1)
row_number窗口函数将以1开头,每个aId的最小日期为1,因此您需要将条件和b.rn=1添加到on子句中。
如果您将其添加到where子句中,它将有效地将您的左连接更改为内部连接。您可以使用外部应用
SELECT a.ID, a.Name, b.Content
FROM a
OUTER APPLY
(
SELECT TOP (1) *
FROM b
WHERE b.aid = a.id
ORDER BY Date ASC
) b
这应该是一个注释,而不是答案。如果a和B中存在多个值,那么您的查询在结果集中只给出了1行。此行以B中创建日期最少的第一个条目为轴。子查询不应该从B WHERE xyz中选择MinDate吗?谢谢您的回答!这是预期的工作。你能看看Mithilesh的答案吗?我试着运行这两个,但在运行时没有区别。我不确定该选哪一个。您能帮忙吗?我想您只会看到两个表的大量记录在运行时上的差异。至于你应该选择哪一个——好吧,我想说,选择你觉得更容易理解的那个。