2017-04-10 33 views
1

假設我有創建的表如下:更新Postgres裏一列只返回錯誤一個值(Postgres的9.5.1)

create table test.sales 
(
customer text, 
purchased text, 
date_purchased date, 
rownumber integer, 
primary key (customer, date_purchased) 
) 
; 

insert into test.sales 
values 
('kevin', 'books', '2017-01-01'::date, null), 
('kevin', 'movies', '2017-01-02'::date, null), 
('paul', 'books', '2017-01-05'::date, null), 
('paul', 'movies', '2017-01-07'::date, null) 

在這一點上,rownumber總是NULL,我想設置值rownumberrow_number() over (partition by customer order by date_purchased) as rownumber。我要對這個方法如下:

update test.sales as a 
set (rownumber) = 
(
select 
    row_number() over (partition by customer order by date_purchased) as rownumber 
from test.sales as b 
-- These fields correspond to the primary keys of the table. 
where a.customer = b.customer 
    and a.date_purchased = b.date_purchased 
) 

但出於某種原因,這個返回:

customer purchased date_purchased rownumber 
kevin  books   1/1/17   1 
kevin  movies  1/2/17   1 
paul   books   1/5/17   1 
paul   movies  1/7/17   1 

我期待這樣的:

customer purchased date_purchased rownumber 
kevin  books   1/1/17   1 
kevin  movies  1/2/17   2 
paul   books   1/5/17   1 
paul   movies  1/7/17   2 

請注意,在實際結果,rownumber始終是1.爲什麼這是?

回答

0

您正在使用標量子查詢。使用相關子查詢來代替:


UPDATE test.sales dst 
SET rownumber = src.rownumber 
FROM (SELECT customer,date_purchased 
     , row_number() over (partition by customer order by date_purchased) as rownumber 
     from test.sales 
     ) src 
WHERE dst.customer = src.customer 
    AND dst.date_purchased = src.date_purchased 
     ; 
+0

有趣!我是否應該擔心效率/可擴展性?我的理解是相關的子查詢不適用於大量的行。 – Vincent

+0

測試它。 (至少結果是正確的,所以無論如何測試是沒用的......) – wildplasser