2014-09-01 112 views
1

我试图从过去4周内从以前没有打过电话的数据库调用过的所有新号码。SQL Server 2008 - 选择NOT EXSIST

所以基本上任何新的数字在过去4个星期....

我已到目前为止是脚本: -

SELECT Telephone, 
     Houseno, 
     Street, 
     Tostreet, 
     Passengername, 
     Acceptancedate 
FROM Telephone AS t 
WHERE AcceptanceDate >= DATEADD(day,-28, GETDATE()) AND Telephone like '07%' or Telephone like '+447%' or Telephone like '+44 7%' 
or Telephone like '+44 7%' or Telephone like '+47%' or Telephone like '01%' 
AND  NOT EXISTS 
     ( SELECT 1 
      FROM Telephone AS t2 
      WHERE t2.Telephone = t.Telephone 
      AND  t2.Acceptancedate < DATEADD(day,-28, GETDATE()) 
     ); 

但是客户端是说它返回数量太多这导致我认为上面的脚本是不正确的一些如何,

有没有人知道我在做什么错了?

+2

过去两周... -28天?也许它返回太多,因为你选择了28而不是14天。 – 2014-09-01 09:55:38

+0

你知道你的布尔表达式实际上是如何计算关于运算符优先级的吗(比如,AND优先级和OR优先级)?因为它看起来像你可以使用一些括号... – 2014-09-01 10:19:08

+0

忘记编辑该部分@TimSchmelter - 客户端将他们的想法从14改为28 – nsilva 2014-09-04 18:29:54

回答

1

我想这改写了一下:

WHERE AcceptanceDate >= DATEADD(day,-28, GETDATE()) AND (Telephone like '07%' or  Telephone like '+447%' or Telephone like '+44 7%' 
or Telephone like '+44 7%' or Telephone like '+47%' or Telephone like '01%') 
AND  NOT EXISTS 
     ( SELECT Telephone 
      FROM Telephone AS t2 
      WHERE t2.Telephone = t.Telephone 
      AND  t2.Acceptancedate < DATEADD(day,-28, GETDATE()) 
     ); 

请您给它一个去?

我已经包括括号中的或部件,所以他们一次过进行评估,否则可能把它当作

AcceptanceDate >= DATEADD(day,-28, GETDATE()) AND Telephone like '07%' 
OR 
Telephone like '+447%' 
OR 
... 
OR 
Telephone like '01%' 
    AND  NOT EXISTS 
      ( SELECT Telephone 
       FROM Telephone AS t2 
       WHERE t2.Telephone = t.Telephone 
       AND  t2.Acceptancedate < DATEADD(day,-28, GETDATE()) 
      ); 

如果你看看上面,例如,当它看起来“电话像+447“那么它忽略了WHERE子句的其余部分。

希望这将帮助你,这是有道理的:)

+1

非常感谢,很确定已将其排序:D从15000条记录到3000 - 非常感谢! – nsilva 2014-09-01 10:04:49

+0

很高兴它帮助! – 2014-09-01 10:05:09

0

看看成什么Operator Precendence装置,用于在WHERE子句中的布尔表达式。这有点像算术表达式中的乘法与加法优先,运算符AND具有与乘法和运算符OR相似的优越性,与加法具有相似的优先权。

您的WHERE表达式的计算结果如下:

(AcceptanceDate >= DATEADD(day,-28, GETDATE()) AND Telephone like '07%') 
OR 
(Telephone like '+447%') 
... 
OR 
(Telephone like '01%' AND NOT EXISTS 
     ( SELECT 1 
      FROM Telephone AS t2 
      WHERE t2.Telephone = t.Telephone 
      AND  t2.Acceptancedate < DATEADD(day,-28, GETDATE()) 
     ); 
) 

这可能不是你的意思?