-2

テーブルAがあります。

|----+----|
| | ぴ | さ |
|----+----|
| | p1 | 1 |
| | p2 | 7 |
| | p3 | 14 |
| | p4 | 23 |
| | p5 | 1 |
|----+----|

および表 B

|----+----|
| | さ | シー |
|----+----|
| | 1 | 21 |
| | 5 | 21 |
| | 23 | 21 |
| | 1 | 30 |
| | 7 | 90 |
|----+----|

テーブルAをソートする必要があります。

ソート順:

A. (TableA.S = TableB.S) および TableB.C = 21 の場合、TableA.S が存在します。
B.テーブルA.P

最終出力:

|----+----|
| | ぴ | さ |
|----+----|
| | p1 | 1 |
| | p4 | 23 |
| | p5 | 1 |
| | p2 | 7 |
| | p3 | 14 |
|----+----|

これは DBIx::Class クエリに変換する必要があります。

私は次のことを試しました:

テーブルA.P、テーブルA.Sを選択
tableA から tableA.S で tableB を左に結合 = tableB.S
ここで (tableB.C = 21 または tableB.C は NULL)
tableB.C、tableA.P 順

しかし、tableB.S が '7' である結果を取得する場所がありません。

ありがとう。

4

2 に答える 2

3

これA.Pは、一致するレコードが B で見つかった A のすべてのレコードを基準に並べ替え、次にA.P他のレコードを基準に並べ替えます。

 SQL> select A.P
       , A.S
from A 
     left join B        
        on ( A.S = B.S 
             and B.C = 21)
order by nvl2(B.S, 'ZZZZZZZZZZ', A.P), A.P
/

  2    3    4    5    6    7    8  
P           S
-- ----------
p1          1
p4         23
p5          1
p2          7
p3         14

SQL>
于 2011-11-11T17:40:58.550 に答える
3

実際には、CASEまたは関連する同等物 (COALESCE(...)および db 固有の関連関数など) の使用を避けることができます。

SELECT TableA.p, TableA.s
FROM TableA
LEFT JOIN TableB
       ON TableA.s = TableB.s
          AND TableB.c = 21
ORDER BY TableB.c, TableA.p

なぜこれが機能するのですか?Oracle(およびその他のデータベース)のデフォルトの動作はnull、「最大」値としてソートすることです(「最小」値と見なす人もいますが、この場合は簡単に修正できます)。そのため、指定された列 (定数値) に値を持つ最初の行が与えられ、次に値のない行が与えられます...

于 2011-11-11T17:41:39.470 に答える