What is wrong with this PostgreSQL UPDATE statement?? - Mailing list pgsql-sql

From Steve Johnson
Subject What is wrong with this PostgreSQL UPDATE statement??
Date
Msg-id 672493ef0808221759n75afc461s6d4b99fec93944ae@mail.gmail.com
Whole thread Raw
Responses Re: What is wrong with this PostgreSQL UPDATE statement??  (Stephan Szabo <sszabo@megazone.bigpanda.com>)
List pgsql-sql
Sorry for the fairly long post.

I'm having a big problem trying to update one table from another in
PostgreSQL 8.3.1.

I have a lookup table called termgroup:

# select * from termgroup;
termgroupname | mindays | maxdays
---------------+---------+---------
1-30 days     |       1 |      30
31-59 days    |      31 |      59
60-89 days    |      60 |      89
90-119 days   |      90 |     119
120-179 days  |     120 |     179
180-364 days  |     180 |     364
1-2 years     |     365 |     729
2-3 years     |     730 |    1094
3-4 years     |    1095 |    1459
4-5 years     |    1460 |    1824
5+ years      |    1825 |  999999
(11 rows)

And also a data table with data that needs to be catagorized using the
above lookup table:

# select * from certgroups;
days | number | termgroupname
------+--------+---------------58 |     66 |303 |     11 |732 |   1056 |
1096 |     66 |25 |    123 |
(5 rows)

As you can see from the detailed session below, the update statement
that works perfectly in MS-SQL 2005 fails miserably in PG.

ANY SUGGESTIONS WOULD BE GREATLY APPRECIATED!!

Thanks,
S.

----------- START of SQL session:

create table termgroup (
termgroupname varchar(20) not null,
mindays int not null,
maxdays int not null,
CONSTRAINT "PKtermgroup_termgroupname" PRIMARY KEY (termgroupname)
);
--
insert into termgroup (termgroupname,mindays,maxdays) values ('1-30 days',1,30);
insert into termgroup (termgroupname,mindays,maxdays) values ('31-59
days',31,59);
insert into termgroup (termgroupname,mindays,maxdays) values ('60-89
days',60,89);
insert into termgroup (termgroupname,mindays,maxdays) values ('90-119
days',90,119);
insert into termgroup (termgroupname,mindays,maxdays) values ('120-179
days',120,179);
insert into termgroup (termgroupname,mindays,maxdays) values ('180-364
days',180,364);
insert into termgroup (termgroupname,mindays,maxdays) values ('1-2
years',365,729);
insert into termgroup (termgroupname,mindays,maxdays) values ('2-3
years',730,1094);
insert into termgroup (termgroupname,mindays,maxdays) values ('3-4
years',1095,1459);
insert into termgroup (termgroupname,mindays,maxdays) values ('4-5
years',1460,1824);
insert into termgroup (termgroupname,mindays,maxdays) values ('5+
years',1825,999999);
--
select * from termgroup order by mindays;
--

create table certgroups (
days int not null primary key,
number int not null,
termgroupname varchar(20) null);
--
insert into certgroups(days,number) values (25,123);
insert into certgroups(days,number) values (58,66);
insert into certgroups(days,number) values (303,11);
insert into certgroups(days,number) values (732,1056);
insert into certgroups(days,number) values (1096,66);
--
select * from certgroups order by days;
--
update certgroups
set termgroupname = tg.termgroupname
from certgroups c, termgroup tg
where (c.days >= tg.mindays) and (c.days <= tg.maxdays);
--
select * from certgroups order by days;
--
/*
-- MS-SQL output (CORRECT):
days        number      termgroupname
----------- ----------- --------------------
58          66          31-59 days
303         11          180-364 days
732         1056        2-3 years
1096        66          3-4 years

(4 row(s) affected)

-- PostgreSQL output (WRONG!!):
days | number | termgroupname
------+--------+---------------58 |     66 | 31-59 days         OK303 |     11 | 31-59 days         WRONG732 |   1056 |
31-59days         WRONG
 
1096 |     66 | 31-59 days         WRONG
(4 rows)
*/

insert into certgroups(days,number) values (25,123);
--
update certgroups
set termgroupname = tg.termgroupname
from certgroups c, termgroup tg
where (c.days >= tg.mindays) and (c.days <= tg.maxdays);
--
select * from certgroups order by days;
--
/*
-- MS-SQL output (CORRECT):
days        number      termgroupname
----------- ----------- --------------------
25          123         1-30 days
58          66          31-59 days
303         11          180-364 days
732         1056        2-3 years
1096        66          3-4 years

(5 row(s) affected)

-- PostgreSQL output (WRONG!!):
days | number | termgroupname
------+--------+---------------25 |    123 | 1-30 days    RIGHT58 |     66 | 1-30 days    WRONG303 |     11 | 1-30 days
  WRONG732 |   1056 | 1-30 days    WRONG
 
1096 |     66 | 1-30 days    WRONG
(5 rows)
*/
----------- END of SQL session


pgsql-sql by date:

Previous
From: Tom Lane
Date:
Subject: Re: Why *no* ambig·uous complain in select part?
Next
From: Stephan Szabo
Date:
Subject: Re: What is wrong with this PostgreSQL UPDATE statement??