SQL简单查询 - 多个条目过滤

时间:2012-08-27 21:50:34

标签: sql database oracle

新手SQL查询问题: 我正在使用Oracle SQL Developer。

我有一张桌子:

<name>  <color>
steve    red
mark     red
steve    green
john     red
ryan     red

我想要做的是让结果只显示颜色栏中包含RED的名称     结果将是:

     mark
     john
     ryan

由于史蒂夫的颜色也是绿色,因此不会出现。

那里的任何人都知道吗?

编辑:
谢谢你的回答。我确实看到我应该在结果中说“红色而没有其他颜色”。对不起,但感谢您的超级快速回复!

6 个答案:

答案 0 :(得分:2)

您只需使用WHERE子句和NOT IN进行查询。

SELECT name
FROM yourTable
WHERE color = 'red'
   AND name NOT IN (
                    SELECT name
                    FROM yourTable
                    WHERE color <> 'red'
                )

请参阅SQL Fiddle with Demo

或者您可以WHERE使用NOT EXISTS

SELECT name
FROM yourTable t1
WHERE color = 'red'
   AND NOT EXISTS (
                    SELECT  t2.name
                    FROM yourTable t2
                    WHERE  t2.color <> 'red'
                     AND t1.name = t2.name
                )

请参阅SQL Fiddle with Demo

答案 1 :(得分:2)

只是为了它的乐趣,这是一个使用窗口函数的解决方案:

select *
from (
  select name, 
         color, 
         count(distinct color) over (partition by name) as color_cnt
  from the_table
) t
where color = 'red' 
and color_cnt = 1;

SQLFiddle:http://sqlfiddle.com/#!4/d267e/3

这个可能比使用子选择的解决方案更快的变化,因为很可能只需要对表进行一次扫描(尽管其他解决方案可能会使用颜色列上的索引可以使两次扫描比单次扫描更便宜

答案 2 :(得分:1)

SELECT name
FROM yourTable
WHERE color = 'red'
and name not in (
SELECT name
FROM yourTable
WHERE color != 'red')

答案 3 :(得分:1)

SELECT DISTINCT name
FROM mytable
WHERE color = 'red'
AND name NOT IN (
    SELECT DISTINCT name
    FROM mytable
    WHERE color <> 'red'
)

答案 4 :(得分:1)

这应该Everyone has a fiddle for you

select t.name from t
join 
   (select name,count(1) cnt from t
     group by name
      having count(1) = 1) n
      on t.name = n.name

答案 5 :(得分:0)

我想这就是你想要的:

SELECT DISTINCT <name> 
FROM <table> 
WHERE <color> = 'red'
AND <name> NOT IN (SELECT DISTINCT <name> 
                     FROM <table> 
                     WHERE <color> != 'red')