2016-10-04 11 views
0

私はタイムスタンプ付きレコードを扱っており、タイムスタンプの違いに基づいて内部結合を行う必要があります。私はDATEDIFF機能を使用しており、うまく機能しているようです。ただし、タイムスタンプ間の時間は異なります。明確にするために、レコードはテーブル1と同じ秒でテーブル2に表示されることがあり、テーブル2のレコードはテーブル1のレコードの後ろに15秒まであることがあります。テーブル1のレコードは、テーブル2の前に常にタイムスタンプが付きます。私が参加することができる他の一般的なフィールドはありませんが、レジスタが同じであることを保証することによって精度を高めるために使用している各テーブルにはレジスタ番号があります。タイムスタンプ付きのSQL Server内部結合:各レコードは1回のみ割り当てられますか?

私の質問は、内部結合を行うためにタイムスタンプの差を増やした場合です(例:DATEDIFF = 1または2または3 ...または15)。または、私のテーブルにはテーブル1の重複レコードが含まれていますか(たとえば、レコード1がレコード2に4を、レコード2にレコード4が、レコード4にレコード4が結合されています。

私の声明が今働く理由は、レジスタの間に6秒未満のレコードがないことです。したがって、一致する複数のタイムスタンプがあっても、レジスタの一致によってこの問題は解決されます。

私のステートメントは、現在として働いている

:あなたが近接した最も近いレコードに適用されCROSSでき

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; 
+0

注:。。あなただけの 'DateDiff関数(S、[アトリウム] [日付2]、[セコイア]を使用することができます[theader_tdatetime] )0〜5 'の間に挿入します。秒(0〜5)の間隔を使用しても、すでに 'Sequoia'テーブルから1行以上に参加することができます。 – gofr1

+1

タイムスタンプでdatetime値を意味すると思いますか? timestampは時刻とは関係のないSQL Serverのデータ型なので、注意してください。 –

+0

ここですべてのOR述語を使用しているのはなぜですか?同じ値を何度も何度もチェックするのではなく、単に範囲を使うのはなぜですか?あなたのwhere句全体を簡単に1つの述語に減らすことができます。それにかかわらず、このようなdatediffに参加すると、エラーが発生しやすくなります。実際には、日付が近いと仮定して行を結合するより良い方法が必要です。これは、外部キーが使用されるように設計されたものです。 –

答えて

2

。しかし、それは決して理想的ではありませんが、複数のレコードが同時に書かれている場合はどうなりますか?あなたはおそらく、その後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; 
+0

これは、同時に書き込まれる唯一のレコードが異なるレジスタで発生し、Atrium.Reader = Sequoia.theader_pos_nameと一致することによって削除されるため、これがうまくいくと思います。 –

関連する問題