加入两个没有唯一记录的表,并比较两列

时间:2013-08-04 13:33:03

标签: sql sql-server database

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

考虑以下

表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中的所有记录,并将表格“Start”与表B“T start”和“T End”进行比较,如果表A的“Start”出现在表B之间“T”启动“和”T End“,然后输出表中的”Check“列将更新为”Y“。

据我所知,表只能基于唯一字段加入,所以我尝试在其中一个表中添加一个自动增量字段以避免重复,但问题是这些表都包含非唯一记录和应考虑每条记录以确定日期。每个表中的记录总数约为60K。我有点震惊。感谢您的帮助。

2 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分: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

或使用apply

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示例了解您的数据。