0

一意のフィールドを持たない 2 つのテーブルを結合し、日付に基づいて比較しようとしました。

次のことを考慮してください

表 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 のすべてのレコードを考慮し、テーブル A の「開始」がテーブル B の「T 開始」と" T End" の場合、出力テーブルの列 "Check" は "Y" として更新されます。

テーブルは一意のフィールドに基づいてのみ結合できることを理解していたので、重複を避けるためにテーブルの 1 つに自動インクリメント フィールドを追加しようとしましたが、テーブルが一意でないレコードで構成されており、各レコードが日付を識別するために考慮されます。各テーブルの合計レコード数は約 60K です。私は少しショックを受けました。あなたの親切な助けに感謝します。

4

2 に答える 2

0

重複をチェックするときは、テーブルを結合するときに注意する必要があります。たとえば、テーブル B に 2 つの日付範囲があり、テーブル A の特定の範囲と重複している場合、テーブル A の行が結果に 2 回表示されます。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

または適用を使用

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 の例を参照してください。

于 2013-08-04T14:14:03.573 に答える