SQL:查找不存在的条目

时间:2011-03-23 13:38:32

标签: sql-server

我知道这听起来倒退但是我正在寻找一种方法来搜索一组记录,其中一个组不包含特定字段。

我们接收来自多家公司的电子邮件数据,将数据解析到我们的数据库中,然后检索我们使用的数据。例如,电子邮件可能会带有姓名,地址,城市,州,邮编和电话。这些属性中的每一个都存储在一个不同的行中,行由一个共同的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                    01234
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                    01234
(no phone field for email_id 4557 on purpose)

当我检索这些数据时,我指定SELECT语句中的字段(SELECT Name,Address,...)并且最近开始出现“找不到电话字段”的错误,我相信这意味着其中一个组电子邮件没有输入“电话”字段。

我的困境是如何搜索缺失的东西。我希望能够运行一个查询,该查询将返回没有关联的“电话”字段的任何电子邮件的emailID。使用上面的数据,查询将返回emailID 4557,因为它没有Phone字段。

如果重要的话我在MSSQL Server 8上。

TIA, 布莱恩

2 个答案:

答案 0 :(得分:6)

您可以使用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

答案 1 :(得分:5)

@Lieven是正确的,获得NOT EXISTS结果的更直观的方法是使用NOT IN(执行计划应该是相同的):

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

修改

正如Lieven在评论中指出的那样,如果您要在字段中检查NULL值,则可能会产生意外结果,在此实例中emailID