3

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

我有一张桌子:

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

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

     mark
     john
     ryan

由于史蒂夫也有绿色,它不会出现。

外面有人知道吗?

编辑:
谢谢你的回答。我确实看到我应该在结果中说“红色且没有其他颜色”。很抱歉造成混乱,但感谢您的超快速回复!

4

6 回答 6

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

于 2012-08-27T21:53:02.240 回答
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

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

于 2012-08-27T22:16:01.500 回答
1
SELECT name
FROM yourTable
WHERE color = 'red'
and name not in (
SELECT name
FROM yourTable
WHERE color != 'red')
于 2012-08-27T21:53:57.593 回答
1
SELECT DISTINCT name
FROM mytable
WHERE color = 'red'
AND name NOT IN (
    SELECT DISTINCT name
    FROM mytable
    WHERE color <> 'red'
)
于 2012-08-27T21:54:03.890 回答
1

这应该这样做每个人都有一个适合你的小提琴

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
于 2012-08-27T21:56:17.217 回答
0

我想这就是你想要的:

SELECT DISTINCT <name> 
FROM <table> 
WHERE <color> = 'red'
AND <name> NOT IN (SELECT DISTINCT <name> 
                     FROM <table> 
                     WHERE <color> != 'red')
于 2012-08-27T21:53:01.410 回答