需要启动一个新线程来处理旧问题的新问题。
原始问题是在这个链接.... complex query join checking that value does not exist
我有两张桌子,第一张有
Tb1 = drID, schedDate, rteID
第二个:
Tb2 = drID, FName, LName, Active
tb1 schedDate的值为11/12/2012,但没有返回记录,如果我输入11/01/2012我得到了正确的记录,但是这个日期在tb1的任何记录中都不存在。
SELECT drID, Fname, LName
FROM TB2
WHERE Active = True
AND drID NOT IN (
SELECT drID
FROM Tb1
WHERE (drID IS NULL OR drID = '')
AND (schedDate = (@targetDate)
)
这两个日期字段都是我尝试过的日期,每个日期字段都是在......
中AND (CAST(schedDate AS DATE) = CAST(@targetDate AS DATE))
和
AND (CAST(schedDate AS DATETIME) = CAST(@targetDate AS DATETIME))
我试图检查提交日期tb1中是否存在drID。
答案 0 :(得分:2)
我认为你的子查询存在根本缺陷:
SELECT drID, Fname, LName
FROM TB2
WHERE Active = True
AND drID NOT IN (
-- You are looking for drID's not included in the following subquery.
SELECT drID
FROM Tb1
WHERE (drID IS NULL OR drID = '')
AND (schedDate = (@targetDate)
)
您的子查询仅返回null或''drID's。
SELECT drID
FROM Tb1
WHERE (drID IS NULL OR drID = '')
AND (schedDate = (@targetDate)
编辑:
为了更清楚,外部查询返回table2中所有drID,Fname,LName,其中活动标志设置为true,drID 不包含在中,drID的列表返回通过子查询。您的子查询永远不会返回drID。
从子查询中删除(drID IS NULL或dirID ='')。
答案 1 :(得分:0)
这将在比较之前从两个日期时间变量中删除任何小时,分钟秒和较小的时间信息。
SELECT drID, Fname, LName
FROM TB2
WHERE Active = True
AND drID NOT IN (
SELECT drID
FROM Tb1
WHERE (drID IS NULL OR drID = '')
AND (dateadd(day,datediff(day,0,schedDate),0) =
dateadd(day,datediff(day,0,@targetDate),0)
)
答案 2 :(得分:0)
这有用吗?
SELECT drID, Fname, LName
FROM TB2 left outer join tb1 on
tb2.drid = tb1.drid and
tb1.active = true and
schedDate = @targetDate
WHERE
tb1.drid is null
如果它是导致它失败的相等的日期测试,你也可以尝试
where abs(datediff(day,@targetDate,schedDate)) < 1
答案 3 :(得分:0)
这是这个问题的正确解决方案....
WHERE not exists (SELECT drID FROM tb1 ....
日期值不在哪里。
感谢所有的反馈。