0

我试图加入两个没有唯一字段的表并根据日期进行比较。

考虑以下

表 A

System ID   Start   Process
132 1/17/2010   10/17/2010
132 2/21/2011   2/23/2011
132 1/16/2010   1/30/2010
132 1/16/2006   1/16/2006
132 1/16/2011   1/24/2010
132 1/30/2011   1/31/2011
132 1/30/2008   2/6/2008
132 2/5/2007    2/8/2007
132 2/5/2009    2/6/2009

表 B

System ID   T start T end
132 05/01/10    4/30/2011
132 05/01/11    4/30/2013

输出表

System ID   Start       Process     Check
132 1/17/2010       10/17/2010      Y
132 2/21/2011       2/23/2011       Y
132 1/16/2010       1/30/2010       Y
132 1/16/2006       1/16/2006       N
132 1/16/2011       1/24/2010       Y
132 1/30/2011       1/31/2011       Y
132 1/30/2008       2/6/2008        N
132 2/5/2007        2/8/2007        N
132 2/5/2009        2/6/2009        N

如果表 A 的“开始”出现在表 B 的“T 开始”和“ T End”,则输出表中的“Check”列将更新为“Y”。

我知道表只能基于唯一字段进行连接,所以我尝试在其中一个表中添加一个自动增量字段以避免重复,但问题是两个表都包含非唯一记录,每条记录都应该被认为是识别日期。每个表中的记录总数约为 60K。我有点震惊。我很感激你的帮助。

4

2 回答 2

1

看起来您正在尝试确定两个表中的日期重叠的位置。以下应该这样做:

select a.*, (case when b.start is not null then 'Y' else 'N' end) as check
from TableA a left outer join
     TableB b
     on a.start <= b.Tend and
        a.end >= b.Tstart and
        (a.start <> b.Tstart and a.end <> b.Tend) and
        a.SystemId = b.SystemId;

可以使用任何类型的关系连接表。当您说“唯一字段”时,您可能指的是“等值连接”。这是连接条件由各个字段之间的“等于”组成的情况。等值连接的优点是它们的处理效率更高(在大多数情况下)。

于 2013-08-04T13:52:34.693 回答
0

当您检查重叠时,连接表时必须小心,例如,如果表 B 中有 2 个日期范围与表 A 中的给定范围重叠,则表 A 中的行将出现在结果中两次。因此,我建议exists用于检查重叠:

select
    A.*,
    case
        when exists
        (
             select *
             from TableB as B
             where B.[System ID] = A.[System ID] and B.[T end] >= A.[Start] and B.[T start] <= A.[Process]
        )
        then 'Y'
        else 'N'
    end as [Checked]
from TableA as A

或使用申请

select
    A.*, case when B.[System ID] is not null then 'Y' else 'N' end as [Checked]
from TableA as A
    outer apply (
        select top 1 *
        from TableB as B
        where B.[System ID] = A.[System ID] and B.[T end] >= A.[Start] and B.[T start] <= A.[Process]
    ) as B

请参阅您的数据的sqlfiddle示例。

于 2013-08-04T14:14:03.573 回答