Oracle SQL WHERE语句问题:查询双菜系厨师无预期结果
问题解答:为什么你的第三条SQL语句返回空结果?
嘿,我来帮你理清楚这个问题~
你遇到的核心问题是对AND逻辑的理解偏差:第三条语句里的speciality = 'Chinese Cuisine' and speciality = 'Japanese Cuisine',是要求同一行数据中的speciality字段同时等于两个完全不同的值——这显然是不可能的,因为一个字段在一行里只能有一个值,所以数据库自然返回空结果。
而Daniel之所以同时出现在前两个查询里,是因为他在speciality表中有两行记录:一行对应Japanese Cuisine,另一行对应Chinese Cuisine,并不是同一行同时包含两个菜系。
正确的写法:如何找出同时擅长两种菜系的厨师?
这里给你几种常用的解决方案:
方法1:使用IN + GROUP BY + HAVING
这种方法先筛选出属于目标菜系的所有记录,再按厨师分组,只保留拥有两种不同菜系的厨师:
SELECT cheffname FROM speciality WHERE speciality IN ('Chinese Cuisine', 'Japanese Cuisine') GROUP BY cheffname HAVING COUNT(DISTINCT speciality) = 2;
方法2:使用子查询(求两个结果集的交集)
先找出擅长日料的厨师,再从中筛选出同时在中餐列表里的人:
SELECT cheffname FROM speciality WHERE speciality = 'Japanese Cuisine' AND cheffname IN ( SELECT cheffname FROM speciality WHERE speciality = 'Chinese Cuisine' );
方法3:使用自连接
把表和自身连接,通过厨师名字匹配,分别筛选两个菜系的记录:
SELECT s1.cheffname FROM speciality s1 JOIN speciality s2 ON s1.cheffname = s2.cheffname WHERE s1.speciality = 'Japanese Cuisine' AND s2.speciality = 'Chinese Cuisine';
以上三种方法都能正确返回Daniel,你可以根据自己的习惯选择使用~
内容的提问来源于stack exchange,提问作者newcoder69




