Sql 包含可能不存在的信息的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语句 试试这个: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子句有两个部分,它们都必须为真 一,。临时电话可以在以下情况下加
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'
)