3

これは、テーブルから前のレコードと次のレコードを選択して、ユーザーが特定の製品名、eqCheeseに最も近い製品も表示できるようにするための最良の方法です。

製品テーブルは次のように定義されます

create table toode (
  toode char(20) primary key, -- product code
  name char (100)    -- product name
  ) 

以下のコードは機能しているようですが、少し見苦しいようです。Postgresでこれを実装するための最良の方法はどれですか?

CREATE temp table toodevalik1 on commit drop as 
SELECT * 
FROM toode 
WHERE name  >= 'Cheese'
order by name, toode
limit 50;

CREATE temp table toodevalik2 on commit drop as 
SELECT * 
FROM toode 
WHERE name  < 'Cheese'
order by name desc, toode desc
limit 50;

SELECT * 
FROM toodevalik1
union all
SELECT * 
FROM toodevalik2
order by name, toode;
4

2 に答える 2

2

CTEを使用する方が速い場合があります。
確かではありません。で確認してくださいEXPLAIN ANALYZE

WITH x AS (
    SELECT *, row_number() OVER (ORDER BY name, toode) AS rn
    FROM   toode
    )
, y AS (
    SELECT COALESCE(
          (SELECT rn FROM x WHERE fest >= 'Cheese' ORDER BY name, toode LIMIT 1)
         ,(SELECT max(rn) FROM x) -- fallback for value > all
        ) AS rn_mid
    )
SELECT *
FROM   x, y -- cross join ok, 1 row from y if any rows exist.
WHERE  x.rn BETWEEN y.rn_mid - 50 AND y.rn_mid + 50 
ORDER  BY rn;
于 2012-12-19T04:23:22.743 に答える
1
(select name from toode where name > 'Cheese' order by name limit 20)
union all
(select name from toode where name < 'Cheese' order by name desc limit 20)

そのクエリは、「チーズ」を囲む40のレコードを提供する必要があります

于 2012-12-18T16:24:55.297 に答える