新手SQL查询问题: 我正在使用Oracle SQL Developer。
我有一张桌子:
<name> <color>
steve red
mark red
steve green
john red
ryan red
我想要做的是让结果只显示颜色栏中包含RED的名称 结果将是:
mark
john
ryan
由于史蒂夫的颜色也是绿色,因此不会出现。
那里的任何人都知道吗?
编辑:
谢谢你的回答。我确实看到我应该在结果中说“红色而没有其他颜色”。对不起,但感谢您的超级快速回复!
答案 0 :(得分:2)
您只需使用WHERE
子句和NOT IN
进行查询。
SELECT name
FROM yourTable
WHERE color = 'red'
AND name NOT IN (
SELECT name
FROM yourTable
WHERE color <> 'red'
)
或者您可以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
)
答案 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')