ログ テーブルと照合する必要がある電話を含む一時テーブルがあります。
一時テーブル
- 電話 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