2014-09-01 114 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()) 
     ); 
) 

這可能不是你的意思?