我有两个表,我们称它们为表A和B:-
表A看起来像这样:
A.Num1 | A.Num2 | A.Date 12345 | 38170 | 28/05/2013 12345 | 38170 | 29/05/2013 12345 | 38170 | 31/05/2013 12345 | 38170 | 01/06/2013 12345 | 38170 | 03/06/2013 12345 | 38170 | 04/06/2013 12345 | 38170 | 04/06/2013 12345 | 38170 | 07/06/2013
表2(B)看起来像这样:
B.Num1 | B.Num2 | B.Status | B.Date 12345 | 38170 | New | 28/05/2013 12345 | 38170 | Closed | 31/05/2013 12345 | 38170 | Reopened | 04/06/2013
我需要一个像这样的表作为输出-它应该基本上包含表A的所有行+表B的状态
Num1 | Num2 | Status | Date 12345 | 38170 | New | 28/05/2013 12345 | 38170 | New | 29/05/2013 12345 | 38170 | Closed | 31/05/2013 12345 | 38170 | Closed | 01/06/2013 12345 | 38170 | Closed | 03/06/2013 12345 | 38170 | Reopened | 04/06/2013 12345 | 38170 | Reopened | 04/06/2013 12345 | 38170 | Reopened | 07/06/2013
另外,最好通过简单的SQL语句,而不是过程。
提前致谢。如有任何澄清,请发表评论
因杜鲁
当表B中的两行状态更改但在同一日期时,联接中的值不一致。
举个例子:
我有两个表,分别是A和B。它们是非常大的表,并且它们记录某些信息。表A通过每隔几天扫描一次数据来记录文件,但缺少状态列。如果有更改,则表B将获得一个带有状态列的新条目。我需要将两者匹配,并为表A中与B对应的每个条目派生一个状态。
Id | Num1 | Num2 | CreatedOn | Status 100 | 12345 | 38170 | 28/05/2013 | New 150 | 12345 | 38170 | 28/05/2013 | Closed 200 | 12345 | 38170 | 31/05/2013 | Reopened 250 | 12345 | 38170 | 04/06/2013 | Closed
Id | Num1 | Num2 | CreatedOn 55 | 12345 | 38170 | 28/05/2013 99 | 12345 | 38170 | 30/05/2013 145 | 12345 | 38170 | 31/05/2013 192 | 12345 | 38170 | 31/05/2013 223 | 12345 | 38170 | 04/06/2013
Id | Num1 | Num2 | CreatedOn | Status 55 | 11552 | 38170 | 28/05/2013 | New 99 | 11552 | 38170 | 30/05/2013 | Closed 145 | 11552 | 38170 | 31/05/2013 | Reopened 192 | 11552 | 38170 | 31/05/2013 | Reopened 223 | 11552 | 38170 | 04/06/2013 | Closed
相反,我得到了:(使用Jeffrey Kamp的回复)
Id | Num1 | Num2 | CreatedOn | Status 55 | 11552 | 38170 | 28/05/2013 | Closed 99 | 11552 | 38170 | 30/05/2013 | Closed 145 | 11552 | 38170 | 31/05/2013 | Reopened 192 | 11552 | 38170 | 31/05/2013 | Reopened 223 | 11552 | 38170 | 04/06/2013 | Closed
这:(使用回复2-马克·班尼斯特)
Id | Num1 | Num2 | CreatedOn | Status 55 | 11552 | 38170 | 28/05/2013 | New 99 | 11552 | 38170 | 30/05/2013 | New 145 | 11552 | 38170 | 31/05/2013 | Reopened 192 | 11552 | 38170 | 31/05/2013 | Reopened 223 | 11552 | 38170 | 04/06/2013 | Closed
显然,记录Id-55可以是New或Closed,因为表B在同一天(2013年5月28日)有两个条目。但是逻辑是它从New-> Closed-> Reopened开始,所以有这样的方式?
对于初学者来说有些简单化:
SELECT A.Num1 ,A.Num2 ,NVL( (SELECT DISTINCT FIRST_VALUE(B.Status) OVER (ORDER BY B.Date DESC) FROM B WHERE B.Num1 = A.Num1 AND B.Num2 = A.Num2 AND B.Date <= A.Date ),'New') AS Status ,A.Date FROM A;
也许有更好的方法可能会更快地工作。