2

私はクエリを書くことに少し困惑しています (SQL は私の得意分野ではありません)。

私は次のものを持っているとしましょうTABLE1

CODE NAME     SCOPE1  SCOPE2    SEQ
------------------------------------
A    a        Here              1
B    b        Here              2
C    c        Here              3
C    c                Room      1
A    aa               Room      2
B    bbb              Room      3

ビジネス キーはCODE + SCOPE1 + SCOPE2であり、SCOPE1SCOPE2は常に相互に排他的です。

、、 でソートする必要がある場合、CODEとの明確な結果を得るにはどうすればよいですか?NAMESCOPE1SCOPE2SEQ

つまり、 と が与えられた場合、次の結果を得たいと思いますSCOPE1 = 'Here'SCOPE2 = 'Room'

CODE NAME
---------
A    a
B    b
C    c
A    aa
B    bbb

注: C cfromはfromRoomと重複しているため不要です。C cHere

DISTINCTwithを使用することの制限を認識してORDER BYおり、私が思いつくことができる最高のものは次のとおりです。

select distinct CODE, NAME from
(
    select CODE, NAME from MYTABLE
    where (SCOPE1='Here' or SCOPE2='Room')
    order by SCOPE1, SCOPE2, SEQ
);

上記は正しいペアを生成しますが、順序が間違っています。をいじってみましGROUP BYたが、よくわからなかったようです。

私は標準 SQL に固執する必要があります (つまり、おそらく Oracle でない限り、製品固有の SQL 構造はありません)。この特定のクエリでは、サブセレクトを回避することはおそらく不可能だと思います。

任意のポインタに非常に感謝します。前もって感謝します。

更新:データ セットを更新しました。peterm の回答に基づいて、これまでに持っているものは次のとおりです: sqlfiddle。シーケンスの微調整を開始すると、MIN/MAX トリックがうまく機能しません。

前提として、私は常に特定の 1 つとSCOPE1ペアになっている特定の 1 つを検索しSCOPE2ます。しかし、すべてのSCOPE1レコードが の前に表示される必要がありますSCOPE2CODE + NAMEアイデアは、私がどちらから来ているSCOPE1かは気にしないということですSCOPE2-私は、、、およびによってソートされた一意のペアがSCOPE1必要SCOPE2ですSEQ

4

1 に答える 1

5

更新Oracle の更新された要件に基づく

SELECT CODE, NAME
  FROM
(
  SELECT CODE, NAME, 
         ROW_NUMBER() OVER (ORDER BY SCOPE1, SCOPE2, SEQ) rnum
    FROM Table1
   WHERE SCOPE1='Here' 
      OR SCOPE2='Room'
) q 
 GROUP BY CODE, NAME
 ORDER BY MIN(rnum)

ここにSQLFiddleがあります

SQL Server で同じように機能させるには

SELECT CODE, NAME
  FROM
(
  SELECT CODE, NAME, 
         ROW_NUMBER() OVER (ORDER BY CASE WHEN SCOPE1 IS NULL 
                                          THEN 1 ELSE 0 END, SCOPE1,
                                     CASE WHEN SCOPE2 IS NULL 
                                          THEN 2 ELSE 3 END, SCOPE2, SEQ) rnum
    FROM Table1
   WHERE SCOPE1='Here' 
      OR SCOPE2='Room'
) q 
 GROUP BY CODE, NAME
 ORDER BY MIN(rnum)

ここにSQLFiddleがあります

出力:

| | コード | 名前 |
---------------
| | あ | | |
| | ビ | b |
| | シー | c |
| | あ | ああ |
| | ビ | bbb |

元の回答:要件の説明に基づいて私が考えることができる唯一のこと

SELECT CODE, NAME
  FROM Table1
 WHERE SCOPE1='Here' 
    OR SCOPE2='Room'
 GROUP BY CODE, NAME
 ORDER BY MIN(SCOPE1), MIN(SCOPE2), MIN(SEQ)

SQLFiddleのデモ (MySql) はこちらSQLFiddleのデモ (SQL Server) はこちらSQLFiddleデモ (Oracle)

MySql と SQL Server ではNULL、デフォルトで最初に実行されるため、次のようになります。

| | コード | 名前 |
---------------
| | ビ | bbb |
| | あ | | |
| | ビ | b |
| | シー | c |

OracleNULLでは、デフォルトで最後に移動するため、次のようになります

| | コード | 名前 |
---------------
| | あ | | |
| | ビ | b |
| | シー | c |
| | ビ | bbb |
于 2013-07-04T16:00:35.223 に答える