如何用子查询编写SQL获取已婚且租金超9000租户的姓名、邮箱、手机号
SQL语句修正方案
原代码问题
- 语法错误:
IN子句不支持直接用AND拼接两个子查询的结果集 - 逻辑冗余:已婚是
PROFILES表本身的字段,不需要单独写子查询过滤 - 细节问题:如果
RENT是数值类型,加单引号会触发隐式类型转换,拖慢查询效率
可用修正写法
写法1:IN子查询实现(写法简单易读)
-- MySQL环境下的字符串拼接请用CONCAT(FIRST_NAME, ' ', LAST_NAME) -- SQL Server环境下请用FIRST_NAME + ' ' + LAST_NAME SELECT FIRST_NAME || ' ' || LAST_NAME AS FULL_NAME, PHONE, EMAIL FROM PROFILES WHERE MARITIAL_STATUS = 'Y' AND PROFILE_ID IN ( SELECT PROFILE_ID FROM TENANCY_HISTORIES WHERE RENT > 9000 );
写法2:EXISTS关联子查询实现(大数据量场景性能更优)
SELECT p.FIRST_NAME || ' ' || p.LAST_NAME AS FULL_NAME, p.PHONE, p.EMAIL FROM PROFILES p WHERE p.MARITIAL_STATUS = 'Y' AND EXISTS ( SELECT 1 FROM TENANCY_HISTORIES th WHERE th.PROFILE_ID = p.PROFILE_ID AND th.RENT > 9000 );
说明
两种写法返回的结果完全一致:所有已婚、且至少存在一条租金高于9000的租住记录的租户的全名、邮箱、联系电话,且不会返回重复的租户数据。
内容的提问来源于stack exchange,提问作者S ri
相关产品推荐
相关产品推荐

