2011-03-23 50 views
1

我知道這聽起來倒退,但我正在尋找一種方法來搜索組中不包含特定字段的記錄組。SQL:查找不存在的條目

我們接收來自多家公司的電子郵件數據,將數據解析到我們的數據庫中,然後檢索數據供我們使用。例如,電子郵件可能會通過姓名,地址,城市,州,郵編和電話來通過。這些屬性中的每一個都存儲在不同的行中,這些行通過一個常見的email_id關聯(我知道這是多麼的低效,我繼承了這個並且在不久的將來會改變它)。

下面是一些行的例子:

 

ID   EmailID   Field_Name    Field_Value 
1234  4556    Name     Joe Bob 
1235  4556    Address    123 Main St. 
1236  4556    City     New York 
1237  4556    State     New York 
1238  4556    Zip    
1239  4556    Phone     1112223333 
1240  4557    Name     Joe Bob 
1241  4557    Address    123 Main St. 
1242  4557    City     New York 
1243  4557    State     New York 
1244  4557    Zip    
(no phone field for email_id 4557 on purpose) 

當我取回這個數據我指定的SELECT語句中的字段(SELECT姓名,地址,...),並於最近開始得到一個錯誤「我找不到電話字段」,我相信這意味着其中一組電子郵件沒有輸入「電話」字段。

我的兩難困境是如何尋找缺失的東西。我希望能夠運行一個查詢,該查詢將返回沒有關聯的「電話」字段的任何電子郵件的emailID。使用上面的數據,查詢將返回emailID 4557,因爲它沒有電話字段。

我在MSSQL Server 8上,如果有問題。

TIA, 布賴恩

+1

僅供參考,您將在Microsoft SQL Server 2008上,沒有版本8 :) – JNK 2011-03-23 13:55:48

回答

5

你可以使用一個LEFT OUTER JOINNOT EXISTS得到違規記錄。

LEFT JOIN

SELECT * 
FROM YourTable yt 
     LEFT OUTER JOIN (
      SELECT EmailID  
      FROM YourTable 
      WHERE Field_Name = 'Phone' 
     ) yte ON yte.EmailID = yt.EmailID 
WHERE yte.EmailID IS NULL 

NOT EXISTS

SELECT * 
FROM YourTable yt 
WHERE NOT EXISTS (
      SELECT EmailID  
      FROM YourTable 
      WHERE Field_Name = 'Phone' 
        AND yt.EmailID = EmailID 
     ) 

對差異(相似)關於這兩種方法很好看,可以發現here

+0

[以後再刷新兩次]您應該在發佈之前測試並確定腳本。答案應該是關於準確性,而不是速度。 – 2011-03-23 13:49:04

+0

@Philip,true,但只是在我發佈了一個正確的LEFT JOIN答案之後,我想用NOT EXISTS添加一個替代方案。然而,NOT EXISTS解決方案最初並沒有包含錯誤(正如你所注意到的)。爲了記錄,我並沒有故意發佈錯誤的解決方案,只是稍後用正確的解決方案進行更改。 – 2011-03-23 13:54:21

4

@Lieven是正確的,以及一個更直觀的方式來獲得NOT EXISTS結果是使用NOT IN(執行計劃應該是相同的):

SELECT * 
FROM YourTable 
WHERE emailid NOT IN(
      SELECT EmailID  
      FROM YourTable 
      WHERE Field_Name = 'Phone') 

編輯:

由於利芬在評論中指出,這可能有意想不到的效果,如果你有NULL值要重新檢查的字段,在本例中爲emailID

+0

+1因爲我非常肯定這會在這種情況下起作用,但是當存在NULL值時,請注意它可能會失敗(返回意外的結果)。 – 2011-03-23 14:00:34

+0

@Lieven - 好點,我忘了包括這一點。我會添加一個註釋。 – JNK 2011-03-23 14:02:02