[英]SQL Server Inner Join with Timestamps: is each record only assigned once?
我正在處理帶時間戳的記錄,並且需要根據時間戳差異進行內部聯接。 我一直在使用DATEDIFF
函數,它似乎運行良好。 但是,時間戳之間的時間量會有所不同。 為了澄清起見,有時記錄在表2中出現的時間與表1的秒數相同,有時表2中的記錄要比表1中的記錄晚15秒。表1中的記錄始終帶有表2的時間戳。沒有其他我可以加入的通用字段,但是在每個表中都有一個寄存器號,我通過確保寄存器相同來提高准確性。
我的問題是:如果我增加時間戳差來進行內部聯接(例如DATEDIFF
= 1或2或3 ...或15),則記錄將僅聯接一次? 還是我的表包含表1中的重復記錄(例如,將記錄1連接到表2中的記錄4,其中差異為4秒,並且還與表2中的記錄7進行連接,其中差異為11秒)?
我的語句現在起作用的原因是沒有寄存器之間的記錄間隔少於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;
您可以交叉應用到附近的最近記錄。 但是,這絕對不是理想的,如果同時寫入多個記錄怎么辦? 您也許應該給第一個表一個標識字段,然后用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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.