3

假设有一个包含两列的表,First Name 和 Eye Color。

在此表中,您可能拥有:

Name - Green Eyes
Name - Brown Eyes

我正在尝试为带有绿眼睛的名称选择所有行,但是如果有一个没有绿眼睛的名称,那么我想选择带有棕色眼睛的名称。我从不想为给定名称返回两行。关于如何做到这一点的任何想法?任何帮助将不胜感激!

4

5 回答 5

3
SELECT COALESCE(g.name, b.name) name,
    COALESCE(g.eye_color, b.eye_color) eye_color

FROM (
  SELECT DISTINCT name, eye_color
  FROM eye_colors
  WHERE eye_color = 'green'
) g

FULL OUTER JOIN (
  SELECT DISTINCT name, eye_color
  FROM eye_colors
  WHERE eye_color = 'brown'
) b
ON b.name = g.name
于 2012-08-27T21:45:55.333 回答
1
IF EXISTS(SELECT * FROM Table WHERE Color='Green')
    SELECT * FROM Table WHERE Color = 'Green'
ELSE
    SELECT * FROM Table WHERE Color='Brown'
于 2014-02-04T18:56:09.010 回答
0

我会在表的 (name,color) 上有一个索引,然后加入它自己,但首先取主要的“绿色”,然后寻找棕色

select
      justName.Name,
      coalesce( Green.Eye_Color, Brown.Eye_Color ) as Eye_Color
   from
      ( select distinct name 
           from eye_colors ) justName
         left join eye_colors as Green
            on justName.Name = Green.Name
           and Green.Eye_Color = 'Green'
         left join eye_colors as Brown
            on justName.Name = Brown.Name
           and Brown.Eye_Color = 'Brown'

预查询只是获得不同的名称,然后通过左连接到表两次,一次是绿色,第二次是棕色。如果绿色记录没有匹配,则获取棕色实例。

于 2014-02-04T19:27:30.477 回答
0

我会做

select * 
from person 
where person.eyecolor = 'green' 
   or (     person.eyecolor = 'brown' 
        and not exists(select null from person where person.eyecolor = 'green')
      )
于 2012-08-27T21:44:52.450 回答
0
select *
from person p
inner join (
    select decode(count(name), 1, 'Green Eyes', 'Brown Eyes') as color
    from person
    where color = 'Green Eyes'
    and rownum < 2
) t
on p.color = t.color

如果至少有一个人拥有“Green Eyes”,则子查询应返回“Green Eyes”,否则将返回“Brown Eyes”。我们可以使用 where 子句进行过滤,而不是内部连接。

于 2018-11-02T12:31:51.540 回答