挺久没更新文章了,哈哈哈,太多事情忙了呀,最近写代码遇到这个需求,记录下,以免以后忘了。
应用场景
使用Left Join左连接查询时,左表为主要表格,从右表中获取一些列数据作为辅助数据,然而右表中存在多条数据,如何取右表中的1条数据跟左表进行连接查询?
代码
错误情况
SELECT LeftTable.*,RightTable.辅助数据 FROM 左表 AS LeftTable Left Join 右表 AS RightTable ON LeftTable.关联列名 = RightTable.关联列名
该种情况中,由于右表中有多条数据,所以导致查询结果数据重复。
正确情况
SELECT 关联列名,辅助数据,ROW_NUMBER() OVER (PARTITION BY 关联列名 ORDER BY 日期 DESC) AS RowNum from 右表
应先对右表中数据进行筛选,相当于将右表中的数据,按照“关联列名”进行分组,按照“日期”去排序,然后新增了一列“RowNum”,其数值为每一个分组中的序号1,2,3,4,5...等等。
关联列 | 辅助数据 | RowNum |
---|---|---|
A1001 | 少年张三 | 1 |
A1001 | 中年张三 | 2 |
A1001 | 老年张三 | 3 |
B1001 | 少年王祖贤 | 1 |
B1001 | 中年王祖贤 | 2 |
B1001 | 老年王祖贤 | 3 |
... | ... | ... |
最终完整代码
SELECT LT.*,RT.辅助数据 FROM 左表 AS LeftTable LEFT JOIN (SELECT * FROM (SELECT 关联列名,辅助数据,ROW_NUMBER() OVER (PARTITION BY 关联列名 ORDER BY 日期 DESC) AS RowNum FROM 右表) AS TempTable WHERE RowNum = 1) AS RightTable ON LeftTable.关联列名 = RightTable.关联列名
取最新日期的辅助数据列内容,作为左表内容的补充。
文章评论