1

我有一个带有电话的临时表,需要根据日志表进行检查。

温度表

  • 电话 varchar(20)

日志表

  • 电话 varchar(20)
  • [状态] varchar(20)
  • 更改日期日期时间

日志表数据

  • 日志表中的每部电话将始终具有“已添加”状态
  • 但并不是每部手机都会有“已移除”的状态

例子:

  • 电话状态更改日期

  • 3054444444 添加于 2012 年 10 月 12 日

  • 4445556666 添加于 2012 年 10 月 12 日
  • 3054444444 已删除 2012 年 11 月 12 日

Where 子句有 2 个部分,它们都必须为真

1. Temp.Phone可以在以下情况下加入:

  • @Date 大于或等于 log.ChangeDate
  • log.Status = '添加'

这是棘手的部分....我无法弄清楚

2. Join 还需要确保:

  • @Date 小于 log.ChangeDate
  • 当 log.Status = 'removed'
  • log.Status = 'removed' 可能不存在,所以我需要检查它是否存在然后它是真的,如果不存在,那么忽略或以某种方式生成一个真

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

您可以第二次加入日志表或使用该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 回答