名と目の色の2つの列を持つテーブルがあるとします。
この表では、次の可能性があります。
Name - Green Eyes
Name - Brown Eyes
緑色の目を持つ名前のすべての行を選択しようとしていますが、緑色の目がない名前がある場合は、茶色の目で名前を選択したいと思います。指定された名前に対して2行を返したくありません。これを行う方法について何か考えはありますか?どんな助けでも大歓迎です!
名と目の色の2つの列を持つテーブルがあるとします。
この表では、次の可能性があります。
Name - Green Eyes
Name - Brown Eyes
緑色の目を持つ名前のすべての行を選択しようとしていますが、緑色の目がない名前がある場合は、茶色の目で名前を選択したいと思います。指定された名前に対して2行を返したくありません。これを行う方法について何か考えはありますか?どんな助けでも大歓迎です!
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
私はするだろう
select *
from person
where person.eyecolor = 'green'
or ( person.eyecolor = 'brown'
and not exists(select null from person where person.eyecolor = 'green')
)
テーブルの (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'
前のクエリは個別の名前を取得し、テーブルへの左結合を 2 回行います。1 回は緑、2 回目は茶色です。緑のレコードに一致するものがない場合、茶色のインスタンスが取得されます。