我尝试加入两个没有唯一字段的表,并根据日期进行比较。
考虑以下
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
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。我有点震惊。感谢您的帮助。
答案 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示例了解您的数据。