从 tbl1 中获取所有记录并从 tbl2 中获取匹配(或下一个关闭)记录,匹配基于 Client# 和从 tbl1 到 tbl2 的日期
Posted
技术标签:
【中文标题】从 tbl1 中获取所有记录并从 tbl2 中获取匹配(或下一个关闭)记录,匹配基于 Client# 和从 tbl1 到 tbl2 的日期【英文标题】:Get all records from tbl1 and matching (or the next close) records from tbl2, match is based on Client# and Date from tbl1 to tbl2 【发布时间】:2019-11-08 19:55:03 【问题描述】:我正在尝试将 Tbl1 匹配(或下一个更大的匹配)从 Tbl1 到 Tbl2。
标准是
-
从 tbl1 中提取所有记录并从 tbl2 中关闭或相等匹配
从 tbl2 中查找匹配记录(匹配基于 ClientNo 和/或日期)
tbl2 匹配应基于大于或等于 tbl1 日期的日期。
结果不应有任何来自 tbl1 或 tbl2 的重复项
第一个匹配应该是 tbl2 中大于或等于 tbl1 中 date1 的第一个 date2
如果同一日期有多个记录,则应根据 tbl2 中的 RefNO 选择下一个更大或相等的日期。
tbl1 包含
RecNo ClientNo Date1
-----------------------------
4 1001 2/6/2017
3 1001 2/4/2018
1 1001 2/5/2018
2 1001 2/5/2018
5 1002 3/8/2018
9 1002 3/9/2018
10 1002 4/11/2019
tbl2 包含
RecNo ClientNo Date2 RefNo
-----------------------------------
1 1001 2/5/2017 1
4 1001 2/5/2018 2
2 1001 2/5/2018 4
3 1001 2/6/2018 5
5 1002 3/9/2018 1
6 1002 4/10/2019 2
查询结果
RecNoTbl1 ClientNo Date1 RecNoTbl2 Date2 RefNo
---------------------------------------------------------------
4 1001 2/6/2017 4 2/5/2018 2
3 1001 2/4/2018 2 2/5/2018 4
1 1001 2/5/2018 3 2/6/2018 5
2 1001 2/5/2018 NULL NULL NULL
5 1002 3/8/2018 5 3/9/2018 1
9 1002 3/9/2018 6 4/10/2019 2
10 1002 4/11/2019 NULL NULL NULL
我尝试使用 ROW OVER PARTITION,但没有奏效。
【问题讨论】:
第二个表的记录都匹配不上怎么办? 请向我们展示您的代码尝试。 下面是我的一个客户编号 1001 的代码...没有按预期产生结果 使用 cl as( Select *, ROW_NUMBER() OVER (partition by clientno order by Clientno,date1) as rwno from tbl1 where ClientNo = '1001'), tr as( Select *, ROW_NUMBER() OVER (partition by clientno order by Clientno,date2,refno) as rwno from tbl2 where ClientNo = '1001') select * from Cl left join tr on cl.clientno = tr.ClientNo where tr.date2 >= cl.date1 and cl.rwno = tr.rwno and cl.ClientNo = '1001' @Gordon Linoff ,如果没有匹配的记录,那么它应该为 tbl1 中的所有记录生成 NULL 结果.. 【参考方案1】:你可以像这样使用左连接查询
Select tb1.*, tb2.* from table1 tb1
Left join table2 tb2 ON tb1.clientno = tb2.clientno Where tb1.date>=tb2.dare
对于独特的,您可以使用 distinct
像这样:select distinct tb1.title
查看this link
distinct的更多信息
对不起,如果不是很详细的事情。我正在通过手机发帖。
【讨论】:
我刚刚用 where 语句更新了它,以匹配 tb1 的日期与 tb2 的日期的大或相等 @知识渊博,感谢您的回复,但您的代码没有给我预期的结果,..它给了我来自 tbl1 和 tbl2 的多条记录。记录总数应等于 tbl1 中的记录。 DISTINCT 不起作用。 最后添加group by语句怎么样? 它不会工作,因为我想要的结果是来自 tbl1 的所有记录,只有来自 tbl2 的匹配记录。一旦 tbl2 中的记录匹配,则匹配客户端编号和日期(等于或更高),那么它不应与 tbl1 中的任何其他记录匹配。最后应该有一个来自 tbl1 的记录,只有一个来自 tbl2 的匹配记录。以上是关于从 tbl1 中获取所有记录并从 tbl2 中获取匹配(或下一个关闭)记录,匹配基于 Client# 和从 tbl1 到 tbl2 的日期的主要内容,如果未能解决你的问题,请参考以下文章
mysql insert into 或 select into - 将列从 tbl1 复制到 tbl2
根据 SQL Server 中表中的列值从两个表中获取一个新表: