我知道这听起来倒退但是我正在寻找一种方法来搜索一组记录,其中一个组不包含特定字段。
我们接收来自多家公司的电子邮件数据,将数据解析到我们的数据库中,然后检索我们使用的数据。例如,电子邮件可能会带有姓名,地址,城市,州,邮编和电话。这些属性中的每一个都存储在一个不同的行中,行由一个共同的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, 布莱恩
答案 0 :(得分:6)
您可以使用LEFT OUTER JOIN
或NOT 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
。