简单的Oracle select语句语法

时间:2015-04-13 08:47:28

标签: oracle

我正在寻找具有以下结果的最佳语法

在我的表(水果)中,

Name         Color
-----------  --------
Apple        Green
Apple        Red
Banana       Yellow
Banana       White
Watermelon   Red
Watermelon   White

我的搜索条件:  颜色:“绿色”& “红色”

SELECT distinct(Name) FROM Fruit
WHERE Color = 'Green' OR Color = 'Red'

这将返回“Apple”和“Watermelon

如果我只希望“Apple”成为结果,那么SQL语句(Oracle)将如何?

谢谢!

4 个答案:

答案 0 :(得分:1)

SELECT name
FROM   FRUIT
WHERE  color IN ( 'Red', 'Green' )
GROUP BY name
HAVING COUNT( DISTINCT color ) = 2;

你也可以使用集合来做同样的事情:

CREATE FruitColorTableType AS TABLE OF FRUIT.COLOR%TYPE;
/

SELECT DISTINCT
       Name
FROM   FRUIT f
WHERE  FruitColorTableType( 'Red', 'Green' )
       SUBMULTISET OF
       CAST( MULTISET(
         SELECT Color
         FROM   FRUIT c
         WHERE  c.name = f.name
       ) AS FruitColorTableType );

OR:

SELECT name
FROM   FRUIT
WHERE  color MEMBER OF FruitColorTableType( 'Red', 'Green' )
GROUP BY name
HAVING COUNT( DISTINCT color ) = 2;

如果您将其重写为函数/过程,则可以将集合作为参数传递,并使用CARDINALITY()函数而不是硬编码集合的大小。

(未测试过最后两个查询,因此可能存在一些拼写错误)

答案 1 :(得分:0)

目前还不完全清楚你为什么要退回“Apple”而不是“西瓜”。我的猜测是,您只想返回那些以name红色和绿色显示的color值。假设是这样的

SELECT name
  FROM fruit
 WHERE color IN ('Red', 'Green')
 GROUP BY name
HAVING COUNT(distinct color) = 2

SELECT name
  FROM fruit
 WHERE color = 'Red'
INTERSECT
SELECT name
  FROM fruit
 WHERE color = 'Green'

会起作用。

答案 2 :(得分:0)

尝试检查两个条件

Select name from fruit  where color ='Red' 
and name in (select  name from fruit
where color='Green');

答案 3 :(得分:-1)

您可以在where子句中使用rownum = 1,但它很脏..就像MySQL中的限制1