代码之家  ›  专栏  ›  技术社区  ›  James Steele

带时间戳的SQL Server内部联接:是否每个记录只分配一次?

  •  0
  • James Steele  · 技术社区  · 8 年前

    我正在处理带时间戳的记录,需要基于时间戳差异进行内部连接。我一直在使用 DATEDIFF

    DATEDIFF =1或2或3…或15)记录是否只连接一次?或者,我的表是否包含表1中的重复记录(例如,记录1与表2中的记录4连接,其中差异为4秒,也与表2中差异为11秒的记录7连接)?

    我的语句现在起作用的原因是没有寄存器的记录间隔小于6秒,因此即使有多个时间戳匹配,寄存器的匹配也消除了这个问题。

    我的发言目前是:

    SELECT *
    INTO AtriumSequoiaJoin5
    FROM Atrium INNER JOIN Sequoia ON Atrium.Reader = Sequoia.theader_pos_name
    WHERE (
        ((DateDiff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=0 
        Or (DateDiff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=1 
        Or (DateDiff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=2 
        Or (DateDiff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=3 
        Or (DateDiff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=4 
        Or (Datediff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=5)
        )
    ORDER BY Sequoia.theader_id;
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Cato    8 年前

    您可以交叉应用到邻近最近的记录。然而,这绝对不是理想的,如果同时写入多个记录怎么办?您可能应该给第一个表一个标识字段,然后用scopeidentity更新下一个表

    SELECT *
    
    INTO AtriumSequoiaJoin5
    
    FROM Atrium CROSS APPLY
        (SELECT TOP 1 * FROM Sequoia WHERE 
                Atrium.Reader = Sequoia.theader_pos_name 
                ORDER BY Datediff(millisecond,[Atrium].[Date2],[Sequoia].[theader_tdatetime])) DQ
    
    ORDER BY Sequoia.theader_id;