0

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

原来的问题是在这个链接.... 复杂的查询连接检查值不存在

我有两张桌子,第一张

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

4 回答 4

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”。

  SELECT drID
  FROM   Tb1
  WHERE  (drID IS NULL OR drID = '')
  AND  (schedDate = (@targetDate)

编辑:

更清楚地说,外部查询从 table2 返回所有 drID、Fname、LName,其中活动标志设置为 true,并且 drID不包含在子查询返回的 drID 列表中。您的子查询永远不会返回 drID。

从子查询中删除 (drID IS NULL or dirID = '')。

于 2012-12-21T19:59:52.400 回答
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)
           )
于 2012-12-21T19:52:21.093 回答
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
于 2012-12-21T19:54:56.207 回答
0

这是这个问题的正确解决方案....

WHERE not exists (SELECT drID FROM tb1 ....

日期值不是问题。

感谢所有的反馈。

于 2013-01-03T19:08:46.493 回答