Sql 包含可能不存在的信息的Where子句

Sql 包含可能不存在的信息的Where子句,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个带有电话的临时表,需要对照日志表进行检查 临时表 电话号码:varchar20 日志表 电话号码:varchar20 [状态]varchar20 更改日期日期时间 日志表数据 日志表中的每部手机都将始终处于添加状态 但并非每部手机都具有“已删除”状态 例如: 电话状态更改日期 3054444增加于2012年12月10日 4445556666增加于2012年10月12日 3054444已于2012年12月11日移除 Where子句有两个部分,它们都必须为真 一,。临时电话可以在以下情况下加

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

临时表

电话号码:varchar20 日志表

电话号码:varchar20 [状态]varchar20 更改日期日期时间 日志表数据

日志表中的每部手机都将始终处于添加状态 但并非每部手机都具有“已删除”状态 例如:

电话状态更改日期

3054444增加于2012年12月10日

4445556666增加于2012年10月12日 3054444已于2012年12月11日移除 Where子句有两个部分,它们都必须为真

一,。临时电话可以在以下情况下加入:

@日期大于或等于log.ChangeDate log.Status='Added' 这是棘手的部分…我不明白

二,。加入还需要确保:

@日期小于log.ChangeDate 当log.Status='removed' Status='removed'可能不存在,所以我需要检查它是否存在,然后检查它是否为true,如果不存在,则忽略或以某种方式生成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')
  or not exists(
       select 'removed'
       from log l2
       where l2.phone = t.phone
       and l2.ChangeDate > @Date AND l2.Status = 'Removed'
    )
  )

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

如果你把你的第二个和改成或,鲍勃可能是你叔叔。我不能…。他们都必须是真的。我认为>需要改成@David:Mmm不,我想,下一个日期你可能不会取下手机。这似乎仍然是基于字段l.ChangeDate小于或大于@date参数的概念。我觉得这很可疑。
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'
  )