2012-12-21 67 views
0

需要启动一个新线程来处理来自旧问题的新问题。子查询不正确评估参数

原来的问题是在这个环节.... complex query join checking that value does not exist

我有两个表,首先必须

Tb1 = drID, schedDate, rteID 

第二个有:

Tb2 = drID, FName, LName, Active 

TB1 schedDate有一个价值2012年11月12日,但返回没有记录,如果我输入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)) 

我想检查是否有drID存在在提交日期tb1。

回答

0

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

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

日期值,其中不是问题。

感谢所有的反馈。

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) 
      ) 
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 
+0

如果datediff返回-2?(然后你的解决方案失败了) – Hogan

+0

加了'abs()'我真的不知道这是不是问题,真 – Beth

+0

真正的'abs()'会解决你的代码问题。 – Hogan

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) 

编辑:

更清晰,外部查询返回所有drID,FNAME,从表2 LName的地方活动标志设置为true,并且drID 不包括在名单drID的由子查询返回。你的子查询永远不会返回一个drID。

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

+0

从所有这些我需要从TB2 drID,Fname,LName返回其中Active = True和drID在tb1中的任何记录上对于所选的schedDate不存在。 对于任何可能的日期都有很多tb1 rteID记录。 – htm11h

+0

主查询的NOT IN部分负责过滤掉第二个查询中存在的任何drID。 – Jake1164

+0

我做了这些更改,它仍然不起作用,除非至少有一条记录要通过与TB2匹配drID来排除。如果Tb1在提交的日期没有记录,则根本不会返回任何内容,但实际上应该从TB2返回所有drID。 – htm11h