2

我有两张桌子,我们称它们为 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 的每个条目派生一个状态。

表 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

表 A

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 - Mark Ba​​nnister)

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 中同一天(28/05/13)有两个条目。但逻辑是它从 New -> Closed -> Reopened 所以有没有这样做的方式?

4

2 回答 2

4

对于初学者来说有些简单:

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;

可能有一种更好的方法可以更快地工作。

于 2013-06-12T07:14:58.910 回答
4

尝试:

select a.Num1, a.Num2, a."Date", b.Status
from TableA a
join (select TableB.*, 
             lead("Date",1) over (partition by Num1, Num2 
                                  order by "Date") NextDate
      from TableB) b
  on a.Num1 = b.Num1 and 
     a.Num2 = b.Num2 and 
     a."Date" >= b."Date" and 
     a."Date" < coalesce(b.NextDate,a."Date"+1)

SQLFiddle在这里

于 2013-06-12T07:32:27.197 回答