从 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查询中结合左连接和右连接

mysql insert into 或 select into - 将列从 tbl1 复制到 tbl2

根据 SQL Server 中表中的列值从两个表中获取一个新表:

ORA:01422 Exact Fetch记录超过请求的行数,因为列变量获取所有值

从多个表中选择逗号分隔

SQL中根据表的顺序选择数据