Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:左联接,但只选择一行创建日期最少的行_Sql_Sql Server_Tsql_Join_Greatest N Per Group - Fatal编程技术网

SQL:左联接,但只选择一行创建日期最少的行

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中日期

假设我有这张桌子:

表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  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的答案吗?我试着运行这两个,但在运行时没有区别。我不确定该选哪一个。您能帮忙吗?我想您只会看到两个表的大量记录在运行时上的差异。至于你应该选择哪一个——好吧,我想说,选择你觉得更容易理解的那个。