我有一张桌子t1
(下面是真实桌子的非常简化的版本)
Name Subject Pass
A Math Yes
A English No
A Science No
B Math No
B English No
B Science No
我需要查询未通过任何主题的所有名称(pass =否)
从t1中选择与众不同的(名称),其中Pass ='否'并且Pass <>'是' 不起作用
答案 0 :(得分:3)
Select distinct(name) from t1 where Pass = 'No' and Pass <> 'Yes'
这是行不通的,因为WHERE子句中的表达式一次只对一行进行求值,而不对整个组求值。您的Pass
列在任何给定行上不能同时具有'No'和'Yes'值,因此,上面的查询将仅过滤Pass ='No'的行,而不管是否还有其他行是的。
对于查询的解决方案,您可以这样编写:
SELECT name
FROM t1
GROUP BY name
HAVING SUM(Pass = 'Yes') = 0
答案 1 :(得分:0)
我会使用聚合。假设pass
仅采用这两个值:
select name
from t1
group by name
having min(pass) = 'No' and max(pass) = 'No';
这将检查给定名称的唯一pass
值是否为'No'
-最小值和最大值相同。
如果您有单独的名称表,则可能是更有效的版本:
select n.name
from names n
where not exists (select 1 from t1 where t1.name = n.name and t1.pass = 'Yes');
这最适合t1(name, pass)
上的索引。
答案 2 :(得分:0)
您的标题和描述不完全匹配-但我认为您是在追求类似的东西(以前的做法)...
SELECT DISTINCT x.name
FROM my_table x
LEFT
JOIN my_table y
ON y.name = x.name
AND y.pass = 1 -- or 'yes', if you insist
WHERE y.name IS NULL