编写SQL查询语句获取拥有橘色猫咪的客户全名并去重的需求
解决方法:查询拥有橘色猫咪的唯一客户全名
没问题,针对你的需求,我整理了几种靠谱的SQL查询方案,都能满足“即使客户有多只橘色猫也只返回一次”的要求,咱们一个个来看:
方法1:内连接 + DISTINCT 去重
这是最直观的写法,通过关联客户和宠物表筛选出目标记录,再用DISTINCT去掉重复的客户条目:
SELECT DISTINCT CONCAT(c.FirstName, ' ', c.LastName) AS FullName FROM Customer c INNER JOIN pets p ON c.Id = p.Id WHERE p.animal = 'Cat' AND p.color = 'Orange';
说明:
INNER JOIN会只保留同时在两张表中有匹配的记录,也就是养了宠物的客户;DISTINCT会自动剔除重复的客户全名,完美解决“多只橘色猫导致重复”的问题;- 用
CONCAT()拼接名字比直接用+更稳妥,哪怕FirstName或LastName为空,也不会让整个全名变成NULL。
方法2:EXISTS 子查询(性能更优)
如果你的数据量比较大,推荐用这个写法,EXISTS只要找到符合条件的记录就会停止检索,效率更高,而且天然不会产生重复:
SELECT CONCAT(c.FirstName, ' ', c.LastName) AS FullName FROM Customer c WHERE EXISTS ( SELECT 1 FROM pets p WHERE p.Id = c.Id AND p.animal = 'Cat' AND p.color = 'Orange' );
说明:
- 子查询会检查当前客户是否存在至少一只橘色猫咪,只要存在就会把该客户加入结果集;
- 因为每个客户只会被检查一次,所以结果里自然不会有重复条目,不需要额外去重操作。
方法3:IN 子查询
这种写法逻辑清晰,先找出所有养橘色猫的客户ID,再根据ID匹配客户全名:
SELECT CONCAT(c.FirstName, ' ', c.LastName) AS FullName FROM Customer c WHERE c.Id IN ( SELECT p.Id FROM pets p WHERE p.animal = 'Cat' AND p.color = 'Orange' );
说明:
- 子查询会返回所有符合条件的客户ID,
IN操作符会自动对这些ID去重,所以最终的客户全名也不会重复。
注意事项:
- 请确保
p.animal和p.color的取值和你实际数据库中的数据一致,比如如果数据里是中文的“猫咪”“橘色”,就把条件改成p.animal = '猫咪' AND p.color = '橘色'; - 如果客户的名字可能包含空格或者特殊字符,
CONCAT依然能正常工作,不用担心拼接问题。
内容的提问来源于stack exchange,提问作者utaf buyukdama
相关产品推荐
相关产品推荐

