0

タイトルの悪い投稿で申し訳ありません。

次のテーブルがあるとします。

C1 | C2       | c3
1  | foo      | x
2  | bar      | y
2  | blaz     | z
3  | something| y
3  | hello    | z
3  | doctor   | x
4  | name     | y
5  | continue | x
5  | yesterday| z
6  | tomorrow | y

次のユニオンを実行するSQLステートメントを考え出そうとしています:最初の検索では、c3 = 'y'ですべてのレコードを取得します

2 番目の検索では、c3 <> 'y' であり、結果が前の共用体にないレコードの最初のインスタンスを検索します

したがって、結果については、次のように表示されます。

C1 | C2   
1  | foo  
2  | bar 
3  | something
4  | name
5  | continue
6  | tomorrow    

2 つの質問: 1: 私はこれができると思う場所で完全にクラックを吸っていますか?

4

3 に答える 3

1

これを試して:

    SELECT C1, C2
    FROM   Table1
    Where  C3 = 'y'

    UNION

   (
    SELECT  C1, C2
    FROM  Table1
    Where C3 <> 'y' ORDER BY C1 LIMIT 1
   )
 ORDER BY C1
于 2012-07-18T00:50:56.660 に答える
1

これを試してください:

SELECT   a.C1, a.C2
  FROM   MyTable a
 WHERE   a.C3 = 'y'
    UNION
SELECT   b.C1, b.C2
  FROM   MyTable b
 WHERE   b.C3 <> 'y' AND
         b.C1 not in 
            (
               SELECT c.C1
                 FROM MyTable c
                WHERE c.C3 = 'y'
            )

更新 1

ところで、希望する結果にのレコードが1 つしかないのはなぜですか? 実際には、 2 つ5ある可能性があります。

デモ1を見る

また

SELECT g.C1, MIN(g.C2) C2
FROM
(SELECT   a.C1, a.C2
  FROM   MyTable a
 WHERE   a.C3 = 'y'
    UNION
SELECT   b.C1, b.C2
  FROM   MyTable b
 WHERE   b.C3 <> 'y' AND
         b.C1 not in 
            (
               SELECT c.C1
                 FROM MyTable c
                WHERE c.C3 = 'y'
            )
) g
GROUP BY g.C1 

デモ 2 を参照してください (目的の結果と同じ結果が得られます)

于 2012-07-18T00:43:10.977 に答える
1

デモ @ SQL フィドル.

select *
  from table1
 where c3 = 'y'
 union all
(select table1.*
  from table1
  left join table1 t1
    on table1.c1 = t1.c1
   and t1.c3 = 'y'
 where table1.c3 <> 'y'
   and t1.c1 is null
 -- The meaning of first becomes clear here
 order by table1.c3, table1.c2
 limit 1)

注: foo は としてマークされているため、リストに含まれていませんx

于 2012-07-18T00:45:26.173 に答える