3

名と目の色の2つの列を持つテーブルがあるとします。

この表では、次の可能性があります。

Name - Green Eyes
Name - Brown Eyes

緑色の目を持つ名前のすべての行を選択しようとしていますが、緑色の目がない名前がある場合は、茶色の目で名前を選択したいと思います。指定された名前に対して2行を返したくありません。これを行う方法について何か考えはありますか?どんな助けでも大歓迎です!

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 に答える
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

テーブルの (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 回目は茶色です。緑のレコードに一致するものがない場合、茶色のインスタンスが取得されます。

于 2014-02-04T19:27:30.477 に答える