Обсуждение: does this require a stored procedure?
Is it possible to rewrite this SQL query so it returns one row having
the columns title and contentType, instead of two rows with the sname
column? I could write a stored procedure to lookup the title or
content-type based on the rec_id, but I would rather do it in a single
query if it's possible.
# SELECT rec_id, url, sname, sval FROM url, urlinfo
WHERE url.rec_id = 1821
AND url.rec_id = urlinfo.url_id
AND sname in('title','Content-Type');
rec_id | url | sname | sval
-------+--------------
+--------------------------------------------------------- 1821 | http://.../ | title | Architectural Research
Consultants, Incorporated Contact Information 1821 | http://.../ | Content-Type | text/html
(2 rows)
mnogosearch=> \d urlinfo Table "public.urlinfo" Column | Type | Modifiers
--------+---------+----------- url_id | integer | not null sname | text | not null sval | text | not null
Indexes: urlinfo_id btree (url_id)
Thanks,
Alex Rice, Software Developer
Architectural Research Consultants, Inc.
alrice@ARCplanning.com
alrice@swcp.com
--- Alex Rice <alrice@ARCplanning.com> wrote:
> Is it possible to rewrite this SQL query so it returns one row having
> the columns title and contentType, instead of two rows with the sname
> column?
>
> # SELECT rec_id, url, sname, sval FROM url, urlinfo
> WHERE url.rec_id = 1821
> AND url.rec_id = urlinfo.url_id
> AND sname in('title','Content-Type');
>
> rec_id | url | sname | sval
> -------+--------------
> +---------------------------------------------------------
> 1821 | http://.../ | title | Architectural Research
> Consultants, Incorporated Contact Information
> 1821 | http://.../ | Content-Type | text/html
> (2 rows)
>
> mnogosearch=> \d urlinfo
> Table "public.urlinfo"
> Column | Type | Modifiers
> --------+---------+-----------
> url_id | integer | not null
> sname | text | not null
> sval | text | not null
> Indexes: urlinfo_id btree (url_id)
>
> Thanks,
> Alex Rice, Software Developer
> Architectural Research Consultants, Inc.
> alrice@ARCplanning.com
> alrice@swcp.com
do you mean something like:
select t.url_id, t.url as title_url, t.sval as title_val, c.url as content_url, c.sval as content_valfrom (select
*from urlinfo where sname = 'title') tjoin (select * from urlinfo where sname = 'Content-type') cusing( url_id );
__________________________________
Do you Yahoo!?
The New Yahoo! Search - Faster. Easier. Bingo.
http://search.yahoo.com
On Thursday, May 8, 2003, at 01:26 PM, chester c young wrote:
> do you mean something like:
>
> select t.url_id, t.url as title_url, t.sval as title_val,
> c.url as content_url, c.sval as content_val
> from
> (select * from urlinfo where sname = 'title') t
> join
> (select * from urlinfo where sname = 'Content-type') c
> using( url_id );
>
Chester. Thanks, this helpful. However I think a stored procedure might
be the way to go. See the url string exists only in the url table.
Also the primary key is named url_id or rec_id depending which table,
so the using(url_id) wouldn't work for that join.
mnogosearch=> \d url Table "public.url" Column | Type |
Modifiers
-----------------+------------------
+-------------------------------------------
---- rec_id | integer | not null default
nextval('next_url_id'::te
xt) status | integer | not null default 0 docsize | integer | not null default 0
next_index_time| integer | not null last_mod_time | integer | referrer | integer |
notnull default 0 hops | integer | not null default 0 crc32 | integer | not null
default0 seed | integer | not null default 0 bad_since_time | integer | site_id |
integer | server_id | integer | pop_rank | double precision | not null default 0 url
| text | not null
mnogosearch=> \d urlinfo Table "public.urlinfo" Column | Type | Modifiers
--------+---------+----------- url_id | integer | not null sname | text | not null sval | text | not null
Indexes: urlinfo_id btree (url_id)
Alex Rice, Software Developer
Architectural Research Consultants, Inc.
alrice@ARCplanning.com
alrice@swcp.com
On Thu, 8 May 2003 12:50:02 -0600, Alex Rice <alrice@ARCplanning.com>
wrote:
>Is it possible to rewrite this SQL query so it returns one row having
>the columns title and contentType, instead of two rows with the sname
>column? [...]
>
># SELECT rec_id, url, sname, sval FROM url, urlinfo
>WHERE url.rec_id = 1821
>AND url.rec_id = urlinfo.url_id
>AND sname in('title','Content-Type');
SELECT u.rec_id, u.url, t.sval AS title, c.sval AS "contentType" FROM url u INNER JOIN urlinfo t ON
(u.rec_id= t.url_id AND t.sname = 'title') INNER JOIN urlinfo c ON (u.rec_id = c.url_id AND c.sname =
'Content-Type')WHEREurl.rec_id = 1821;
Use LEFT JOINs if it's not sure that there is always a 'title' and a
'Content-Type'.
ServusManfred