SQL查询语法审核:获取Q1符合条件的账户邮箱地址
SQL语句审核与修正建议
原需求回顾
现有两张表:
- Accounts表:包含
account_name、account_id、account_email_addresses字段 - Opportunities表:包含
opp_id、account_id、opp_stage、created_date、close_date、mrr(月度经常性收入)字段
需要查询满足以下条件的账户邮箱地址列表:
- 商机状态为
Open - 年度经常性收入≥10000美元(通过
mrr * 12计算) - 商机关闭日期在2023年第一季度内
原SQL的错误点
- NOT逻辑语法与逻辑错误
原语句WHERE NOT opp_stage 'Closed Won' OR 'Closed Lost'完全不符合SQL语法:
- 缺少比较运算符,不能直接写
opp_stage 'Closed Won' - 逻辑上,你想表达“商机状态不是Closed Won或Closed Lost”,但OR的优先级低于NOT,会导致逻辑混乱。更直接的写法是直接判断
opp_stage = 'Open'(符合你的需求),或者用opp_stage NOT IN ('Closed Won', 'Closed Lost')。
- 字段与数值格式错误
'mrr' * 12里的单引号会把mrr识别成字符串而非字段,应该去掉单引号,写成mrr * 12- 数值
10,000里的逗号是非法格式,SQL中数字不能加千分位逗号,要写成10000
字段名不匹配
原SELECT语句里的account_email_address,和Accounts表的字段account_email_addresses(末尾多了个s)不一致,会导致字段不存在的错误。JOIN类型不合理
使用RIGHT JOIN会包含所有符合条件的商机,即使该商机没有关联的账户(此时邮箱会为NULL),但你需要的是账户邮箱列表,更合理的是用INNER JOIN,只保留有对应账户的商机记录。
修正后的SQL语句
SELECT a.account_email_addresses, a.account_id FROM Accounts a INNER JOIN Opportunities o ON a.account_id = o.account_id WHERE o.opp_stage = 'Open' AND o.close_date BETWEEN '2023-01-01' AND '2023-03-31' AND o.mrr * 12 >= 10000;
注:日期格式建议用'YYYY-MM-DD',避免不同数据库的解析差异;给表加别名(a、o)让语句更简洁。
内容的提问来源于stack exchange,提问作者eric_harper
相关产品推荐
相关产品推荐

