powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / составной запрос
36 сообщений из 36, показаны все 2 страниц
составной запрос
    #38605401
snowbrook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день.. хочу понять составные запросы..
есть 3 таблицы
client(clientid,surname,phone,...),
clientseason(cseasonid,clientid,seasonid,...),
season(seasonid,typename,...)
допустим мне нужно вывести фамилии клиентов и телефоны, у которых тип абонемента "студенческий"..
вот мой запрос..

select surname, phone
from client
where clientid=(
select clientid from clientseason where seasonid= (
select seasonid from season where typeseason = 'студенческий 8'))

выдаёт ошибку..

Multiple rows in singleton select

Заранее спасибо!
...
Рейтинг: 0 / 0
составной запрос
    #38605402
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snowbrookвыдаёт ошибку..

Multiple rows in singleton selectвсё правильно выдаёт.
тебе перевести?

а вообще join поможет отцу русской демократии.
...
Рейтинг: 0 / 0
составной запрос
    #38605407
snowbrook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
перевод понятен.. как исправить?
...
Рейтинг: 0 / 0
составной запрос
    #38605408
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snowbrook> допустим мне нужно вывести фамилии клиентов и телефоны,
snowbrook> у которых тип абонемента "студенческий"..

Такое не подзапросами (а не составными запросами, как ты сказал)
надо делать, а явными (join) или неявными соединениями таблиц.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
составной запрос
    #38605411
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snowbrookперевод понятен.. как исправить?join поможет отцу русской демократии.
...
Рейтинг: 0 / 0
составной запрос
    #38605419
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
select surname, phone
from client c
    join clientseason cs on c.clientid = cs.clientid
    join season s on (cs.seasonid = s.seasonid) and (s.typeseason = 'студенческий 8')



Прочитай лекции, справочник SQL.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
составной запрос
    #38605440
snowbrook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
благодарю, читаю как раз
...
Рейтинг: 0 / 0
составной запрос
    #38606018
snowbrook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а теперь, чтоб помимо этих данных ещё выводились данные datestart из clientseason..
делаю:

select surname, phone, datestart
from client c, clientseason cs
inner join clientseason on c.clientid = cs.clientid
inner join season s on (cs.seasonid = s.seasonid) and (s.typeseason = 'студенческий 8')

выводит почему-то не то, что хотелось бы..
...
Рейтинг: 0 / 0
составной запрос
    #38606035
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snowbrookвыводит почему-то не то, что хотелось бы..
Очевидно потому, что ты пишешь не то что хотелось бы...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
составной запрос
    #38606045
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RTFM: http://ibase.ru/devinfo/joins.htm
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
составной запрос
    #38606058
snowbrook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
отличная статья! благодарности!
...
Рейтинг: 0 / 0
составной запрос
    #38610846
anpl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snowbrookдобрый день.. хочу понять составные запросы..
есть 3 таблицы
client(clientid,surname,phone,...),
clientseason(cseasonid,clientid,seasonid,...),
season(seasonid,typename,...)
допустим мне нужно вывести фамилии клиентов и телефоны, у которых тип абонемента "студенческий"..
вот мой запрос..

select surname, phone
from client
where clientid=(
select clientid from clientseason where seasonid= (
select seasonid from season where typeseason = 'студенческий 8'))

выдаёт ошибку..

Multiple rows in singleton select

Заранее спасибо!

а зачем такое извращение? ты бы еще штук 5 скрытых джоинов сделал в веаре...

Код: sql
1.
2.
3.
4.
5.
select cl.surname, cl.phone
from season s
left join clientseason cls on cls.seasonid=s.id
left join client cl on cl.id=cls.clientid
where  s.typeseason=8


всех полей в твоих таблицах не знаю... Там где ID это интуитивно догадываюсь что такие поля :)
...
Рейтинг: 0 / 0
составной запрос
    #38610853
anpl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snowbrookа теперь, чтоб помимо этих данных ещё выводились данные datestart из clientseason..
делаю:

select surname, phone, datestart
from client c, clientseason cs
inner join clientseason on c.clientid = cs.clientid
inner join season s on (cs.seasonid = s.seasonid) and (s.typeseason = 'студенческий 8')

выводит почему-то не то, что хотелось бы..

Отучайся от такого рода запросов... если данных не много то обрабатываться будет нормально! Но в таблицах где миллионы строк, такие селекты будут обрабатываться часами...

это я об этом:
Код: sql
1.
 from client c, clientseason cs



а это вобще бред... что ты этим хотел сделать?
Код: sql
1.
2.
3.
4.
select surname, phone, datestart
from client c, clientseason cs
    inner join clientseason on c.clientid = cs.clientid
    inner join season s on (cs.seasonid = s.seasonid) and (s.typeseason = 'студенческий 8')


особенно не пойму
Код: plsql
1.
2.
from client c, clientseason cs
    inner join clientseason on c.clientid = cs.clientid
...
Рейтинг: 0 / 0
составной запрос
    #38610864
anpl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Код: sql
1.
2.
3.
4.
select surname, phone
from client c
    join clientseason cs on c.clientid = cs.clientid
    join season s on (cs.seasonid = s.seasonid) and (s.typeseason = 'студенческий 8')



Прочитай лекции, справочник SQL.


у него веар только по одной таблице... по этому плясать лучше начинать от нее

Код: sql
1.
2.
from season s
where s.typeseason = 'студенческий 8'
...
Рейтинг: 0 / 0
составной запрос
    #38610889
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anplу него веар только по одной таблице... по этому плясать лучше начинать от нее
уверен что " плясать лучше начинать от нее "???
...
Рейтинг: 0 / 0
составной запрос
    #38610894
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snowbrookа теперь, чтоб помимо этих данных ещё выводились данные datestart из clientseason..
делаю:

select surname, phone, datestart
from client c, clientseason cs
inner join clientseason on c.clientid = cs.clientid
inner join season s on (cs.seasonid = s.seasonid) and (s.typeseason = 'студенческий 8')

выводит почему-то не то, что хотелось бы..
алиасы таблицы необходимо использовать, чтобы не путаться.
...
Рейтинг: 0 / 0
составной запрос
    #38610896
anpl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7manplу него веар только по одной таблице... по этому плясать лучше начинать от нее
уверен что " плясать лучше начинать от нее "???
уверен что
Код: sql
1.
2.
3.
4.
5.
select cl.surname, cl.phone
from season s
left join clientseason cs on cs.seasonid = s.seasonid
left join client cl on cl.clientid = cs.clientid
where s.typeseason = 'студенческий 8'


будет выполнятся быстрее чем:

Код: sql
1.
2.
3.
4.
select surname, phone
from client c
    join clientseason cs on c.clientid = cs.clientid
    join season s on (cs.seasonid = s.seasonid) and (s.typeseason = 'студенческий 8')
...
Рейтинг: 0 / 0
составной запрос
    #38610940
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anpl,
а я вот не уверен в этом.
Более того я уверен что по времени выполнения разницы не будет
...
Рейтинг: 0 / 0
составной запрос
    #38610944
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7manpl,
а я вот не уверен в этом.
Более того я уверен что по времени выполнения разницы не будетнужны планы, чтобы не спорить.
выкладывайте уже кто-нибудь.
...
Рейтинг: 0 / 0
составной запрос
    #38610950
anpl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7manpl,
а я вот не уверен в этом.
Более того я уверен что по времени выполнения разницы не будет
разница будет пропорциональна количеству строк в таблицах...
...
Рейтинг: 0 / 0
составной запрос
    #38610952
anpl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadsterm7manpl,
а я вот не уверен в этом.
Более того я уверен что по времени выполнения разницы не будетнужны планы, чтобы не спорить.
выкладывайте уже кто-нибудь.
а вот здесь согласен! ) нужны планы... не известно что там за база...
...
Рейтинг: 0 / 0
составной запрос
    #38610972
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anplа вот здесь согласен! ) нужны планы... не известно что там за база...надо нагенерить данных.
таблиц немного.
давайте уже, займитесь кто-нибудь.
ЗЫ просто интересно.
...
Рейтинг: 0 / 0
составной запрос
    #38611041
anpl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadsteranplа вот здесь согласен! ) нужны планы... не известно что там за база...надо нагенерить данных.
таблиц немного.
давайте уже, займитесь кто-нибудь.
ЗЫ просто интересно.

Как то так
С ключами и индексами

Plan
PLAN JOIN (JOIN (S INDEX (SEASON_TYPESEASON), CS INDEX (RDB$FOREIGN58)), CL INDEX (RDB$PRIMARY79))

Adapted Plan
PLAN JOIN (JOIN (S INDEX (SEASON_TYPESEASON), CS INDEX (FK_SEASON_CLIENTSEASON_SEASONID)), CL INDEX (INTEG_223))

------ Performance info ------
Prepare time = 0ms
Execute time = 15ms
Avg fetch time = 7,50 ms
Current memory = 10 649 144
Max memory = 18 250 804
Memory buffers = 256
Reads from disk to cache = 7
Writes from cache to disk = 0

---
Plan
PLAN JOIN (CL NATURAL, CS INDEX (RDB$FOREIGN59), S INDEX (RDB$PRIMARY23))

Adapted Plan
PLAN JOIN (CL NATURAL, CS INDEX (FK_CLIENT_CLIENTSEASON_CLIENTID), S INDEX (INTEG_52))

------ Performance info ------
Prepare time = 0ms
Execute time = 624ms
Avg fetch time = 312,00 ms
Current memory = 10 554 192
Max memory = 18 250 804
Memory buffers = 256
Reads from disk to cache = 3 349
Writes from cache to disk = 0
...
Рейтинг: 0 / 0
составной запрос
    #38611047
anpl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первый план на
Код: sql
1.
2.
3.
4.
5.
select cl.surname, cl.phone
from season s
left join clientseason cs on cs.seasonid = s.seasonid
left join client cl on cl.clientid = cs.clientid
where s.typeseason = 'студенческий 8'


второй
Код: sql
1.
2.
3.
4.
select surname, phone
from client c
    join clientseason cs on c.clientid = cs.clientid
    join season s on (cs.seasonid = s.seasonid) and (s.typeseason = 'студенческий 8')
...
Рейтинг: 0 / 0
составной запрос
    #38611048
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anplReads from disk to cache = 7
...
Reads from disk to cache = 3 349вау
прикольно.
надо запомнить.
...
Рейтинг: 0 / 0
составной запрос
    #38611056
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anpl,

Код: sql
1.
2.
3.
4.
5.
select cl.surname, cl.phone
from season s
join clientseason cs on cs.seasonid = s.seasonid
join client cl on cl.clientid = cs.clientid
where s.typeseason = 'студенческий 8'



а если вот так? мне кажется тут дело не в left/inner а в том что s.typeseason = 'студенческий 8' в условие соединения воткнуто
...
Рейтинг: 0 / 0
составной запрос
    #38611064
anpl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут дело в том что смотря в какой таблице будет больше всего данных! в 90% случаях первый селект будет выполнятся быстрей...
но если в таблице season будет мало строк, а остальные таблицы будут тяжелые (пару миллионов строк) то скорость выполнения будет одинаковой.
А по логике во втором запросе сначала джойнится вся таблица clientseason и client с season а потом только отсекается лишнее, в первом варианте отсекается все лишнее а потом идет джоин
...
Рейтинг: 0 / 0
составной запрос
    #38611070
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anplпервый план на
Код: sql
1.
2.
3.
4.
5.
select cl.surname, cl.phone
from season s
left join clientseason cs on cs.seasonid = s.seasonid
left join client cl on cl.clientid = cs.clientid
where s.typeseason = 'студенческий 8'


второй
Код: sql
1.
2.
3.
4.
select surname, phone
from client c
    join clientseason cs on c.clientid = cs.clientid
    join season s on (cs.seasonid = s.seasonid) and (s.typeseason = 'студенческий 8')



японский бог,
мой первый ответ был на 15860270
там лефтом и не пахнет
а когда отвечал на это 15860427 то на запросы просто не обратил внимания
...
Рейтинг: 0 / 0
составной запрос
    #38611080
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисanpl,

Код: sql
1.
2.
3.
4.
5.
select cl.surname, cl.phone
from season s
  join clientseason cs on cs.seasonid = s.seasonid
  join client cl on cl.clientid = cs.clientid
where s.typeseason = 'студенческий 8'



а если вот так? мне кажется тут дело не в left/inner а в том что s.typeseason = 'студенческий 8' в условие соединения воткнуто

и вот так
Код: sql
1.
2.
3.
4.
select surname, phone
from client c
    join clientseason cs on c.clientid = cs.clientid
    join season s on (cs.seasonid = s.seasonid) and (s.typeseason = 'студенческий 8')



То время планы и время выполнения должны быть одинаковые
...
Рейтинг: 0 / 0
составной запрос
    #38611082
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anpl,

оптимизатор для того и существует чтобы самому определять с каких таблиц начинать соединение. Кроме того, у меня подозрение, что

Plan
PLAN JOIN (CL NATURAL, CS INDEX (RDB$FOREIGN59), S INDEX (RDB$PRIMARY23))

не может быть от запроса

Код: sql
1.
2.
3.
4.
select surname, phone
from client c
    join clientseason cs on c.clientid = cs.clientid
    join season s on (cs.seasonid = s.seasonid) and (s.typeseason = 'студенческий 8')



т.к. в нём нет таблицы с алиасом CL
...
Рейтинг: 0 / 0
составной запрос
    #38611089
anpl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисanpl,

оптимизатор для того и существует чтобы самому определять с каких таблиц начинать соединение. Кроме того, у меня подозрение, что

Plan
PLAN JOIN (CL NATURAL, CS INDEX (RDB$FOREIGN59), S INDEX (RDB$PRIMARY23))

не может быть от запроса

Код: sql
1.
2.
3.
4.
select surname, phone
from client c
    join clientseason cs on c.clientid = cs.clientid
    join season s on (cs.seasonid = s.seasonid) and (s.typeseason = 'студенческий 8')



т.к. в нём нет таблицы с алиасом CL

Код: sql
1.
2.
3.
4.
select сl.*
from client cl
 join clientseason cs on cl.clientid = cs.clientid
    join season s on (cs.seasonid = s.seasonid) and (s.typeseason = 'студенческий 8')


вот так выглядел селект
Ладно не хочу спорить! Что вам мешает сейчас взять и сделать подобные селекты?

По поводу
Код: sql
1.
2.
3.
4.
5.
select cl.surname, cl.phone
from season s
  join clientseason cs on cs.seasonid = s.seasonid
  join client cl on cl.clientid = cs.clientid
where s.typeseason = 'студенческий 8'


Plan
PLAN JOIN (CL NATURAL, CS INDEX (RDB$FOREIGN59), S INDEX (RDB$PRIMARY23))

Adapted Plan
PLAN JOIN (CL NATURAL, CS INDEX (FK_CLIENT_CLIENTSEASON_CLIENTID), S INDEX (INTEG_52))

------ Performance info ------
Prepare time = 0ms
Execute time = 609ms
Avg fetch time = 304,50 ms
Current memory = 10 562 264
Max memory = 18 250 804
Memory buffers = 256
Reads from disk to cache = 3 356
Writes from cache to disk = 0
Fetches from cache = 226 301
...
Рейтинг: 0 / 0
составной запрос
    #38611131
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anpl,

у меня цель не спорить. Если оптимизатор не понимает чего-то, то его надо научить, т.е. необходимо разобраться почему так и возможно написать тикет в трекер.

Что касается последнего запроса, то я вот не понимаю почему оптимизатор не стал применять индекс SEASON_TYPESEASON и сам не догадался что дешевле будет зайти с таблицы season s.

Единственная пока догадка что значения в этом поле распределены слишком неравномерно, т.е. большинство записей typeseason <> 'студенческий 8', но при этом равны какому-то другому значению многократно повторяющемуся. Таким образом, индекс имеет плохую селективность, а гистограммы значений пока не поддерживаются.
...
Рейтинг: 0 / 0
составной запрос
    #38611175
anpl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисanpl,

у меня цель не спорить. Если оптимизатор не понимает чего-то, то его надо научить, т.е. необходимо разобраться почему так и возможно написать тикет в трекер.

Что касается последнего запроса, то я вот не понимаю почему оптимизатор не стал применять индекс SEASON_TYPESEASON и сам не догадался что дешевле будет зайти с таблицы season s.

Единственная пока догадка что значения в этом поле распределены слишком неравномерно, т.е. большинство записей typeseason <> 'студенческий 8', но при этом равны какому-то другому значению многократно повторяющемуся. Таким образом, индекс имеет плохую селективность, а гистограммы значений пока не поддерживаются.
вы правильно рассуждаете...
в таблице SEASON 100к записей и только одна 'студенческий 8' и
в clientseason 10 записей в client 30
Я выше упоминал... что огромное значение имеет размеры каждой из таблиц...
...
Рейтинг: 0 / 0
составной запрос
    #38611189
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anpl,

дело не в размерах, а в равномерности распределений значений TYPESEASON. В большинстве случаев оптимизатор сам способен выбрать порядок соединения таблиц учитывая их размер и селективность индексов.

http://www.ibase.ru/devinfo/dataaccesspaths.htm
...
Рейтинг: 0 / 0
составной запрос
    #38611190
anpl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в clientseason 10 записей в client 30
извиняюсь... дезинформировал
в clientseason 30 строк в client 10 строк
...
Рейтинг: 0 / 0
составной запрос
    #38611193
anpl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисanpl,

дело не в размерах, а в равномерности распределений значений TYPESEASON. В большинстве случаев оптимизатор сам способен выбрать порядок соединения таблиц учитывая их размер и селективность индексов.

http://www.ibase.ru/devinfo/dataaccesspaths.htm
Не поверите! именно эта ссылка у меня уже минут 10 открыта )
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / составной запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]