取消资格显示记录(如果存在于列中)

时间:2018-07-18 07:13:56

标签: sql oracle plsql

我在表中有两列。颜色和形状。而且我只希望没有正方形的那些颜色。

使用:

SELECT DISTINCT color
FROM t1
WHERE shape NOT IN ('square');

将导致结果为黄色,但没有此线条为正方形。我希望这种形状的存在可以自动排除黄色。

Color Shape

yellow round
yellow square
yellow oval
white round
white oval

3 个答案:

答案 0 :(得分:1)

您需要在此处使用子查询:

SELECT DISTINCT color
FROM t1
WHERE color NOT IN (select color from t1 where shape='square');

说明 子查询将返回形状为正方形的颜色,然后使用 NOT IN 子句可以从输出中过滤掉这些颜色

答案 1 :(得分:1)

如果您不想使用square形状的颜色,则可以使用not exists来代替:

select t.*
from table t
where not exists (select 1 from table t1 where t1.color = t.color and t1.shape = 'square');

答案 2 :(得分:0)

我将使用group byhaving

SELECT color
FROM t1
GROUP BY color
HAVING SUM(CASE WHEN shape = 'square' THEN 1 ELSE 0 END) = 0;

HAVING子句计算具有square的行数。 = 0说不存在。在许多情况下,这可能比使用SELECT DISTINCT过滤器的WHERE更快。 SELECT DISTINCTGROUP BY的数据库工作类似。