6

:を使用する簡単なSELECTクエリを作成するとします。VIEW

CREATE TEMP VIEW people AS
SELECT 
     p.person_id
    ,p.full_name
    ,p.phone
FROM person p
ORDER BY p.last_name;

SELECT
     p.*
    ,h.address
    ,h.appraisal
FROM people p
LEFT JOIN homes h
     ON h.person_id = p.person_id
ORDER BY p.last_name, h.appraisal;

ここでの明らかな問題はp.last_name、ファイナルを実行するときに使用できなくなったことですORDER BY

peopleビューの元のシーケンスが最終クエリに続くように、最終クエリを並べ替えるにはどうすればよいですか?

ここでの簡単な解決策は、ビューにp.last_nameを含めることです。私はそれをしたくありません-私の実世界の例(はるかに複雑)はそれを問題にします。

私は過去に一時テーブルで同様のことをしました。たとえば、でテーブルを作成してからCREATE TEMP TABLE testing WITH OIDS、を実行しORDER BY testing.oidて元のシーケンスをパススルーします。

ビューで同じことを行うことは可能ですか?

4

3 に答える 3

5

を使えば可能ですrow_number() over()

次に例を示します。

SELECT
    p.*
    ,h.address
    ,h.appraisal
FROM (SELECT *, row_number() over() rn FROM people) p
LEFT JOIN homes h
    ON h.person_id = p.person_id
ORDER BY p.rn, h.appraisal;

そして、これがテストできるSQL Fiddleです。

@Erwin Brandstetter が正しく指摘しているように、 を使用rank()すると正しい結果が生成され、追加のフィールド (この場合は評価) で並べ替えることができます。

SELECT
    p.*
    ,h.address
    ,h.appraisal
FROM (SELECT *, rank() over() rn FROM people) p
LEFT JOIN homes h
    ON h.person_id = p.person_id
ORDER BY p.rn, h.appraisal;

このように考えると、row_number() を使用すると、他の並べ替えパラメーターに関係なく、常にそのフィールドのみで並べ替えられます。同じ順位で rank() を使用すると、他のフィールドを簡単に検索できます。

幸運を。

于 2013-01-31T23:29:17.807 に答える
3

@sgeddesのアイデアに基づいて構築されていますが、rank()代わりに以下を使用してください。

SELECT p.*
      ,h.address
      ,h.appraisal
FROM  (SELECT *, rank() OVER() AS rn FROM people) p
LEFT  JOIN homes h ON h.person_id = p.person_id
ORDER BY p.rn, h.appraisal;

違いを示すテスト ケースを用意しました。
->sqlfiddle

于 2013-02-01T00:25:17.247 に答える
1

row_number 列を作成し、select で使用します。

CREATE TEMP VIEW people AS
SELECT 
     row_number() over(order by p.last_name) as i
    ,p.person_id
    ,p.full_name
    ,p.phone
FROM person p

SELECT
     p.*
    ,h.address
    ,h.appraisal
FROM people p
LEFT JOIN homes h
     ON h.person_id = p.person_id
ORDER BY p.i, h.appraisal
于 2013-01-31T23:29:10.087 に答える