假设有一个包含两列的表,First Name 和 Eye Color。
在此表中,您可能拥有:
Name - Green Eyes
Name - Brown Eyes
我正在尝试为带有绿眼睛的名称选择所有行,但是如果有一个没有绿眼睛的名称,那么我想选择带有棕色眼睛的名称。我从不想为给定名称返回两行。关于如何做到这一点的任何想法?任何帮助将不胜感激!
假设有一个包含两列的表,First Name 和 Eye Color。
在此表中,您可能拥有:
Name - Green Eyes
Name - Brown Eyes
我正在尝试为带有绿眼睛的名称选择所有行,但是如果有一个没有绿眼睛的名称,那么我想选择带有棕色眼睛的名称。我从不想为给定名称返回两行。关于如何做到这一点的任何想法?任何帮助将不胜感激!
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
IF EXISTS(SELECT * FROM Table WHERE Color='Green')
SELECT * FROM Table WHERE Color = 'Green'
ELSE
SELECT * FROM Table WHERE Color='Brown'
我会在表的 (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'
预查询只是获得不同的名称,然后通过左连接到表两次,一次是绿色,第二次是棕色。如果绿色记录没有匹配,则获取棕色实例。
我会做
select *
from person
where person.eyecolor = 'green'
or ( person.eyecolor = 'brown'
and not exists(select null from person where person.eyecolor = 'green')
)
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 子句进行过滤,而不是内部连接。