2012-12-18 18 views
3

選擇最近的記錄更好的辦法即從表中選擇一個和下一個記錄,讓用戶看到也最接近的產品,爲給定的產品名稱最好的辦法,EQ奶酪在PostgreSQL

產品表被定義爲

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; 

回答

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個記錄圍繞 '奶酪'

+2

你需要一個'order by'來排序聯合結果。 –

2

使用CTEs可能會更快。
不確定,這取決於。請諮詢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;