子查询没有正确评估参数

时间:2012-12-21 19:28:58

标签: sql-server-2008 tsql

需要启动一个新线程来处理旧问题的新问题。

原始问题是在这个链接.... 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。

4 个答案:

答案 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 ....

日期值不在哪里。

感谢所有的反馈。