1

ログ テーブルと照合する必要がある電話を含む一時テーブルがあります。

一時テーブル

  • 電話 varchar(20)

ログテーブル

  • 電話 varchar(20)
  • [ステータス] varchar(20)
  • 変更日日時

ログ テーブル データ

  • ログ テーブル内のすべての電話のステータスは常に「追加済み」です。
  • ただし、すべての電話が「削除済み」のステータスになるわけではありません。

例:

  • 電話ステータスの変更日

  • 3054444444 2012 年 10 月 12 日追加

  • 4445556666 2012 年 10 月 12 日追加
  • 3054444444 2012 年 11 月 12 日削除

Where 句には 2 つのセクションがあり、両方とも true でなければなりません

1. Temp.Phone は次の場合に参加できます。

  • @Date が log.ChangeDate 以上です
  • log.Status = '追加'

ここがトリッキーな部分です....私には理解できません

2. Join では、次のことも確認する必要があります。

  • @Date が log.ChangeDate より小さい
  • log.Status = '削除' の場合
  • log.Status = 'removed' が存在しない可能性があるため、存在するかどうかを確認し、存在しない場合は無視するか、どういうわけか true を生成する必要があります

SQL ステートメント

SELECT *
FROM #temp t
JOIN log l
ON t.Phone = l.Phone
WHERE  (l.ChangeDate < = @Date AND  l.Status = 'Added')    
  AND 
       (l.ChangeDate > @Date AND l.Status = 'Removed') --may not exist, but ALSO has to be true
4

2 に答える 2

2

これを試して:

SELECT *
FROM #temp t
JOIN log l
  ON t.Phone = l.Phone
WHERE (l.ChangeDate < = @Date AND  l.Status = 'Added')    
  AND (
   (l.ChangeDate > @Date AND l.Status = 'Removed')
  or not exists(
       select 'removed'
       from log l2
       where l2.phone = t.phone
       and l2.ChangeDate > @Date AND l2.Status = 'Removed'
    )
  )
于 2013-10-15T18:24:59.793 に答える
1

ログテーブルに 2 回目に参加するか、NOT EXISTS句を使用することができますが、日付の不等式を確認してください...

SELECT *
FROM #temp t
    INNER JOIN log l
    ON t.Phone = l.Phone
    AND l.Status = 'Added'
    AND l.ChangeDate <= @Date
WHERE NOT EXISTS (
    SELECT *
    FROM Log
    -- This makes sure that the phone wasn't removed in between the date it was
    -- added and the date you are querying.
    WHERE Log.ChangeDate > l.ChangeDate
        AND Log.ChangeDate <= @Date
        AND Log.Phone = t.Phone
        AND Log.Status = 'Removed'
  )
于 2013-10-15T18:28:23.377 に答える