Как в запросе использовать другой запрос?

Я (кажется пока еще Я)...
Дата: 10.11.2003 10:52:24
Подскажите, плиз, как в запросе вместо таблицы использовать результаты другого запроса?
Например:
select * from (select * from table)
- не смотрите на логику (ее нет в этом примере :) ), а подскажите, если кто понял вопрос, как правильно организовать такой запрос и возможно ли такое...
Руслан41
Дата: 10.11.2003 11:16:19
Если у тебя есть таблица "Изделия" (поля имя изделия, класс изделия, ID класса изделия, Ну и Id самого изделия) и таблица "Классы изделия" по заданному имени класса изделия получить список всех изделий из данного класса можно так
SELECT name FROM izdelie WHERE ClassID = (SELECT id FROM class WHERE name = "Name of class");
а можно еще так
SELECT iz.name AS name FROM izdelie iz, class c WHERE iz.classid = c.id AND c.name = "Name of Class";

Это FAQ а не сказки братьев Гримм
Я (кажется пока еще Я)...
Дата: 10.11.2003 11:31:02
Мдя... просил на логику не смотреть, так все равно про какие-то сказки братков грят.. :))
Придется описать задачу: есть 2 таблицы, в таблице А комбинация A.id1 & A.id2 - уникальна, в таблице В - нет, необходимо подсчитать кол-во уникальных комбинаций после объединения... что-то типа этого...
select count(*) from
(select distinct A.id1, A.id2
from A inner join B on A.id1=B.id1 and A.id2=B.id2
where B.name='...')
assa
Дата: 10.11.2003 15:08:10
в 7.3. пока нормально работает синтаксис
SELECT {список вывода}
FROM table1, (SELECT ... FROM ...) AS alias1, ...

в 7.0. были проблемы с уровнем вложенности и с OUTER JOIN -ами (не понимал он их).
Я (кажется пока еще Я)...
Дата: 10.11.2003 15:16:39
Не хочет выполнять такой запрос:
select distinct on (id1, id2) count(*) from table;
- что посоветуете?
LeXa NalBat
Дата: 10.11.2003 15:45:05
Какова цель этого запроса?

? select id1, id2, count(*) from table group by id1, id2

P.S.: Судья и палач придираются к моему приказу "Казнить нельзя помиловать". Подскажите, куда вставить запятую?
assa
Дата: 10.11.2003 15:50:22
Не пойму физ смысла запроса:

"Выбрать по одной (т.е. первые попавшиеся записи) имеющими уникальные наборы из списка" .. и тут же "кол-во записей"???

"одна запись" - по определению одна (1). какой у нее "каунт" ???

Чего хочется то?
assa
Дата: 10.11.2003 15:54:54
А, число записей с данными, сгруппированнми по {список полей}?
тогда см. <LeXa NalBat> (выше)
Я (кажется пока еще Я)...
Дата: 10.11.2003 16:29:47
Спасибо Всем, кто мне пытался помочь, сделал. Работает так как хотел.
Просто щенячья радость :)
Но теперь, вопрос какой вариан работает быстрее (совет типа замерь время ответа не годится, так как не только я сервер юзаю и запрос может простоять в очереди).

1 вариант:
select tab1.id, tab1.name
from tab1 inner join tab2 on tab1.id=tab2.id
where tab1.a=5, tab2.b='str'

2 вариант:
select T1.id, T1.name
from (select tab1.id, tab1.name from tab1 where tab1.a=5) as T1 inner join tab2 on T1.id=tab2.id
where tab2.b='str'

первая таблица tab1 - небольшая и в ней все поля числовые, вторая tab2 - много больше и поиск происходит по текстовым полям.
Объясните, что объединение таблиц происходит сразу с проверкой условия в 1 варианте или сначало объединение, а затем, выборка по условиям?
LeXa NalBat
Дата: 10.11.2003 18:29:38
Сравните explain-планы ваших запросов. ( Вам же только "справочку" взять - пропустят без "очереди". :)

Еще можно сделать explain analyze.

P.S.:

rpl=# explain select id from bbs_posts, bbs_words, bbs_dictionary where id=psid and bbs_words.wrid=bbs_dictionary.wrid and boardid=1 and word='москв';
NOTICE: QUERY PLAN:

Nested Loop (cost=0.00..70.20 rows=1 width=88)
-> Nested Loop (cost=0.00..64.31 rows=1 width=66)
-> Index Scan using i_bbs_dict_wi on bbs_dictionary (cost=0.00..5.99 rows=1 width=23)
-> Index Scan using i_bbs_words_wt on bbs_words (cost=0.00..58.15 rows=14 width=43)
-> Index Scan using pk_bbs_posts_id on bbs_posts (cost=0.00..5.88 rows=1 width=22)

EXPLAIN
rpl=# explain select id from ( select id from bbs_posts where boardid=1 ) as bbs_posts, bbs_words, ( select wrid from bbs_dictionary where word='москв' ) as bbs_dictionary where id=psid and bbs_words.wrid=bbs_dictionary.wrid;
NOTICE: QUERY PLAN:

Nested Loop (cost=0.00..70.20 rows=1 width=88)
-> Nested Loop (cost=0.00..64.31 rows=1 width=66)
-> Index Scan using i_bbs_dict_wi on bbs_dictionary (cost=0.00..5.99 rows=1 width=23)
-> Index Scan using i_bbs_words_wt on bbs_words (cost=0.00..58.15 rows=14 width=43)
-> Index Scan using pk_bbs_posts_id on bbs_posts (cost=0.00..5.88 rows=1 width=22)

EXPLAIN
rpl=# explain select id from bbs_dictionary join bbs_words using(wrid) join bbs_posts on(id=psid) where boardid=1 and word='москв';
NOTICE: QUERY PLAN:

Nested Loop (cost=0.00..70.20 rows=1 width=88)
-> Nested Loop (cost=0.00..64.31 rows=1 width=66)
-> Index Scan using i_bbs_dict_wi on bbs_dictionary (cost=0.00..5.99 rows=1 width=23)
-> Index Scan using i_bbs_words_wt on bbs_words (cost=0.00..58.15 rows=14 width=43)
-> Index Scan using pk_bbs_posts_id on bbs_posts (cost=0.00..5.88 rows=1 width=22)

EXPLAIN
rpl=# explain select id from ( select wrid from bbs_dictionary where word='москв' ) as bbs_dictionary join bbs_words using(wrid) join ( select id from bbs_posts where boardid=1 ) as bbs_posts on(id=psid);
NOTICE: QUERY PLAN:

Nested Loop (cost=0.00..70.20 rows=1 width=88)
-> Nested Loop (cost=0.00..64.31 rows=1 width=66)
-> Index Scan using i_bbs_dict_wi on bbs_dictionary (cost=0.00..5.99 rows=1 width=23)
-> Index Scan using i_bbs_words_wt on bbs_words (cost=0.00..58.15 rows=14 width=43)
-> Index Scan using pk_bbs_posts_id on bbs_posts (cost=0.00..5.88 rows=1 width=22)

EXPLAIN
rpl=# explain select id from bbs_posts join bbs_words on(id=psid) join bbs_dictionary using(wrid) where boardid=1 and word='москв';
NOTICE: QUERY PLAN:

Nested Loop (cost=8319.83..8569.49 rows=1 width=88)
-> Index Scan using i_bbs_dict_wi on bbs_dictionary (cost=0.00..5.99 rows=1 width=23)
-> Materialize (cost=8538.92..8538.92 rows=1966 width=65)
-> Merge Join (cost=8319.83..8538.92 rows=1966 width=65)
-> Sort (cost=22.74..22.74 rows=15 width=22)
-> Seq Scan on bbs_posts (cost=0.00..22.45 rows=15 width=22)
-> Sort (cost=8297.09..8297.09 rows=77788 width=43)
-> Seq Scan on bbs_words (cost=0.00..1977.88 rows=77788 width=43)

EXPLAIN
rpl=# explain select id from ( select id from bbs_posts where boardid=1 ) as bbs_posts join bbs_words on(id=psid) join ( select wrid from bbs_dictionary where word='москв' ) as bbs_dictionary using(wrid);
NOTICE: QUERY PLAN:

Nested Loop (cost=8319.83..8569.49 rows=1 width=88)
-> Index Scan using i_bbs_dict_wi on bbs_dictionary (cost=0.00..5.99 rows=1 width=23)
-> Materialize (cost=8538.92..8538.92 rows=1966 width=65)
-> Merge Join (cost=8319.83..8538.92 rows=1966 width=65)
-> Sort (cost=22.74..22.74 rows=15 width=22)
-> Seq Scan on bbs_posts (cost=0.00..22.45 rows=15 width=22)
-> Sort (cost=8297.09..8297.09 rows=77788 width=43)
-> Seq Scan on bbs_words (cost=0.00..1977.88 rows=77788 width=43)

EXPLAIN
rpl=# select version();
version
-------------------------------------------------------------
PostgreSQL 7.2.3 on i686-pc-linux-gnu, compiled by GCC 2.96
(1 row)