Multiple rows in singleton select

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
john_chek
Сообщения: 28
Зарегистрирован: 24 янв 2007, 12:39

Multiple rows in singleton select

Сообщение john_chek » 24 янв 2007, 12:43

Есть 3 таблицы в Firebird 2.0: Kart, Sotrud и Kros_Isp. Kros_Isp – кросстаблица в которой 2 внешних ключа: ID_Sotrud и ID_Kart. Необходимо из Kart выбрать все записи при условии что Кros_Isp.Id_Sotrud =: Sotrud.Id.
Пишу запрос:

Код: Выделить всё

select * from kart where id = (select kros_isp.id_kart from kros_isp where kros_isp.id_sotrud =: Sotrud.id)
Если единичная выборка, т.е. запросу соответствует только 1 запись, то выбирает, а если больше записей, то пишет: multiple rows in singleton select.
Distinct – не помогает!
Подскажите пожалуйста, что не так, не могу понять!?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 24 янв 2007, 13:05

Тебе нужен либо in, либо join+distinct. Второе может быть быстрее.

john_chek
Сообщения: 28
Зарегистрирован: 24 янв 2007, 12:39

Сообщение john_chek » 24 янв 2007, 14:00

Dimitry Sibiryakov писал(а):Тебе нужен либо in, либо join+distinct. Второе может быть быстрее.
Не понял, join для склеивания таблиц, а мне склеивать нечего!? Я пытаюсь выбрать все в "лоб" из Kart. А если In, то куда?
По подробнее можно?
Кстати если всего 2 записи соответствует запросу, то тоже выдаёт ту же самую ошибку!

john_chek
Сообщения: 28
Зарегистрирован: 24 янв 2007, 12:39

Сообщение john_chek » 24 янв 2007, 14:47

Написал вот так:

Код: Выделить всё

select * from kart where id in (select kros_isp.id_kart from kros_isp where (kros_isp.id_sotrud) in (:Sotrud.id))
Все прекрасно выбирает!!!
Спасибо!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 24 янв 2007, 14:52

Все прекрасно выбирает!!!
читай www.ibase.ru/devinfo/joins.htm

Ответить