This is a discussion on Need help building SQL query within the pgsql Novice forums, part of the PostgreSQL category; --> Hello, I have a problem as to which I do not know how to solve. My tables are built ...
| |||||||
| FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| ||||
| Hello, I have a problem as to which I do not know how to solve. My tables are built like this: Timereportbreak consists of four breaks for each timereport. They are ordered by the indexnumber (0-3). They are connected to the timereport table using the column timereportid. Code: CREATE TABLE timereportbreak ( timereportid int4 NOT NULL DEFAULT 0, starttime time NOT NULL DEFAULT '00:00:00'::time without time zone, endtime time NOT NULL DEFAULT '00:00:00'::time without time zone, indexnumber int4 NOT NULL DEFAULT 0 ) WITH OIDS; ALTER TABLE timereportbreak OWNER TO postgres; Code: CREATE TABLE timereport
(
employeesignature varchar(6) NOT NULL DEFAULT ''::character varying,
startdate date,
workedtimetotal time NOT NULL DEFAULT '00:00:00'::time without time zone,
starttime time NOT NULL DEFAULT '00:00:00'::time without time zone,
endtime time NOT NULL DEFAULT '00:00:00'::time without time zone,
statuscode int2 NOT NULL DEFAULT 0,
note text NOT NULL DEFAULT ''::text,
internalinfo varchar(80) NOT NULL DEFAULT ''::character varying,
id int4 NOT NULL DEFAULT nextval('timereport_id_seq'::text),
CONSTRAINT "TimeReport_pkey" PRIMARY KEY (id)
)
WITH OIDS;
ALTER TABLE timereport OWNER TO postgres;
What I would like to retrieve is all columns from timereport and the four timereportbreaks connected to the timereport table. However, since each break is not a separate column I am not sure how to solve this. And since this database already has data in it. I can't remodel the table. This is the output I want: timereport.*, timereportbreak0start, timereportbreak0end, timereportbreak1start, timereportbreak1end, ... I did try something like this but using LIMIT makes it faulty and errornous: Code: CREATE OR REPLACE FUNCTION timereport_getbydateandemployee("varchar", date,
date, "varchar")
RETURNS SETOF timereportandbreaks AS
$BODY$
SELECT DISTINCT
timereport.employeesignature,
timereport.startdate,
timereport.workedtimetotal,
timereport.starttime,
timereport.endtime,
timereport.statuscode,
timereport.note,
timereport.internalinfo,
timereport.id
,(SELECT timereportbreak.starttime FROM timereportbreak, timereport,
employee
WHERE
(timereport.startdate BETWEEN $2 AND $3)
AND
(upper(timereport.employeesignature) = upper($4))
AND
upper(timereport.employeesignature) = upper(employee.signature)
AND
employee.companyid = $1
AND
timereport.id = timereportbreak.timereportid
AND
timereportbreak.indexnumber = '0'
LIMIT '1'
) AS break1start
,(SELECT timereportbreak.endtime FROM timereportbreak, timereport,
employee
WHERE
(timereport.startdate BETWEEN $2 AND $3)
AND
(upper(timereport.employeesignature) = upper($4))
AND
upper(timereport.employeesignature) = upper(employee.signature)
AND
employee.companyid = $1
AND
timereport.id = timereportbreak.timereportid
AND
timereportbreak.indexnumber = '0'
LIMIT '1'
) AS break1end
,(SELECT timereportbreak.starttime FROM timereportbreak, timereport,
employee
WHERE
(timereport.startdate BETWEEN $2 AND $3)
AND
(upper(timereport.employeesignature) = upper($4))
AND
upper(timereport.employeesignature) = upper(employee.signature)
AND
employee.companyid = $1
AND
timereport.id = timereportbreak.timereportid
AND
timereportbreak.indexnumber = '1'
LIMIT '1'
) AS break2start
,(SELECT timereportbreak.endtime FROM timereportbreak, timereport,
employee
WHERE
(timereport.startdate BETWEEN $2 AND $3)
AND
(upper(timereport.employeesignature) = upper($4))
AND
upper(timereport.employeesignature) = upper(employee.signature)
AND
employee.companyid = $1
AND
timereport.id = timereportbreak.timereportid
AND
timereportbreak.indexnumber = '1'
LIMIT '1'
) AS break2end
,(SELECT timereportbreak.starttime FROM timereportbreak, timereport,
employee
WHERE
(timereport.startdate BETWEEN $2 AND $3)
AND
(upper(timereport.employeesignature) = upper($4))
AND
upper(timereport.employeesignature) = upper(employee.signature)
AND
employee.companyid = $1
AND
timereport.id = timereportbreak.timereportid
AND
timereportbreak.indexnumber = '2'
LIMIT '1'
) AS break3start
,(SELECT timereportbreak.endtime FROM timereportbreak, timereport,
employee
WHERE
(timereport.startdate BETWEEN $2 AND $3)
AND
(upper(timereport.employeesignature) = upper($4))
AND
upper(timereport.employeesignature) = upper(employee.signature)
AND
employee.companyid = $1
AND
timereport.id = timereportbreak.timereportid
AND
timereportbreak.indexnumber = '2'
LIMIT '1'
) AS break3end
,(SELECT timereportbreak.starttime FROM timereportbreak, timereport,
employee
WHERE
(timereport.startdate BETWEEN $2 AND $3)
AND
(upper(timereport.employeesignature) = upper($4))
AND
upper(timereport.employeesignature) = upper(employee.signature)
AND
employee.companyid = $1
AND
timereport.id = timereportbreak.timereportid
AND
timereportbreak.indexnumber = '3'
LIMIT '1'
) AS break4start
,(SELECT timereportbreak.endtime FROM timereportbreak, timereport,
employee
WHERE
(timereport.startdate BETWEEN $2 AND $3)
AND
(upper(timereport.employeesignature) = upper($4))
AND
upper(timereport.employeesignature) = upper(employee.signature)
AND
employee.companyid = $1
AND
timereport.id = timereportbreak.timereportid
AND
timereportbreak.indexnumber = '3'
LIMIT '1'
) AS break4end
FROM
timereport, timereportbreak, employee
WHERE
(timereport.startdate BETWEEN $2 AND $3)
AND
(upper(timereport.employeesignature) = upper($4))
AND
(upper(timereport.employeesignature) = upper(employee.signature))
AND
(employee.companyid = $1)
AND
(timereportbreak.timereportid = timereport.id)
ORDER BY
timereport.startdate,
timereport.starttime
$BODY$
LANGUAGE 'sql' VOLATILE;
ALTER FUNCTION timereport_getbydateandemployee("varchar", date, date,
"varchar") OWNER TO postgres;
Any help would be tremendously appretiated. // Kind Regards Robert ---------------------------(end of broadcast)--------------------------- TIP 4: Have you searched our list archives? http://archives.postgresql.org |
| |||
| On Mon, Dec 05, 2005 at 10:28:04 +0100, Robert Blixt <robert.blixt@transpa.se> wrote: > > Timereportbreak consists of four breaks for > each timereport. They are ordered by the > indexnumber (0-3). They are connected to the > timereport table using the column timereportid. > > What I would like to retrieve is all columns from timereport > and the four timereportbreaks connected to the timereport table. > However, since each break is not a separate column I am not > sure how to solve this. And since this database already has data > in it. I can't remodel the table. This is the output I want: Normally you want to do this by joining to Timereportbreak once for each break (i.e. 4 times) using a different table alias for each join. Then you can use the a different condition on indexnumber for each alias to get the appropiate break. ---------------------------(end of broadcast)--------------------------- TIP 3: Have you checked our extensive FAQ? http://www.postgresql.org/docs/faq |
| ||||
| > -----Ursprungligt meddelande----- > Från: pgsql-novice-owner@postgresql.org [mailto > owner@postgresql.org] För Bruno Wolff III > Skickat: den 5 december 2005 17:46 > Till: Robert Blixt > Kopia: pgsql-novice@postgresql.org > Ämne: Re: [NOVICE] Need help building SQL query > > On Mon, Dec 05, 2005 at 10:28:04 +0100, > Robert Blixt <robert.blixt@transpa.se> wrote: > > > > Timereportbreak consists of four breaks for > > each timereport. They are ordered by the > > indexnumber (0-3). They are connected to the > > timereport table using the column timereportid. > > > > What I would like to retrieve is all columns from timereport > > and the four timereportbreaks connected to the timereport table. > > However, since each break is not a separate column I am not > > sure how to solve this. And since this database already has data > > in it. I can't remodel the table. This is the output I want: > > Normally you want to do this by joining to Timereportbreak once for each > break (i.e. 4 times) using a different table alias for each join. Then > you can use the a different condition on indexnumber for each alias to > get the appropiate break. > Thanks for your help, highly appretiated. Regards, Robert ---------------------------(end of broadcast)--------------------------- TIP 4: Have you searched our list archives? http://archives.postgresql.org |