www.map-info.ru :: Просмотр темы - Некорректная выборка при использовании подзапроса
                               РќР° главную страницу сайта

 
                                
ВходВход    РегистрацияРегистрация    ПрофильПрофиль    ПользователиПользователи    ГруппыГруппы    FAQFAQ    ПоискПоиск  

 
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Предыдущая тема :: Следующая тема  
Автор Сообщение
Nick4



Зарегистрирован: 15.10.2011
Сообщения: 95

СообщениеДобавлено: Вт Фев 17, 2015 10:24 am    Заголовок сообщения: Некорректная выборка при использовании подзапроса Добавить ответ со ссылкой на данный текст

Есть таблица предприятий с уникальным полем id. Вторая таблица - список продукции, с полем kod_id , которое указывет на первую таблицу. Задача - по названию продукции, вывести список предприятий,которые её выпускают. Делаю запрос:
select * from список1 where id=any(select kod_id from список2 where продукция="хлеб") into itog.
В результате в таблице itog должны быть все предприятия, которые выпускают хлеб. Но если в списке2 для одного предприятия более одной строки с продукцией хлеб, то в списке itog предприятие повторяется по числу строк с продукцией. И я получаю список в котором одно предприятие дублируется. Есть ли другие методы выборки? Как можно решить поставленную задачу?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
thegeo



Зарегистрирован: 17.01.2012
Сообщения: 119

СообщениеДобавлено: Вт Фев 17, 2015 3:19 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

У меня (MI v.11.5) запрос
Select * from sp1 where ID= any(select IDsp1 from sp2 where tm="хлеб") into Selection
выдает требуемый результат. Если в таблице sp2 сочетание полей (IDsp1+tm) равное (2+хлеб) имеет место, например в 5 строках то в полученной выборке будет только одна строка с ID=2.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Nick4



Зарегистрирован: 15.10.2011
Сообщения: 95

СообщениеДобавлено: Ср Фев 18, 2015 1:18 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Я тоже понимаю, что должно быть так. Более того, если вместо select в скобках указать конкретные числа, то все работает корректно. Но если в скобках select, то проблема. У меня MI 12.0.2.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Nick4



Зарегистрирован: 15.10.2011
Сообщения: 95

СообщениеДобавлено: Ср Фев 18, 2015 5:53 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Решил странным способ. Убрал индекс в первой таблице по id и все стало корректно. При добавлении птички в индекс по полю id, опят дублирует строки. ???
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
FedorinoFF



Зарегистрирован: 01.02.2007
Сообщения: 272
Откуда: Санкт-Петербург

СообщениеДобавлено: Пт Фев 20, 2015 12:18 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Nick4, от чего таблички для примера не дали? можно было практически все проверить, а не на пальцах общаться... индексы они полезные, в принципе.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Nick4



Зарегистрирован: 15.10.2011
Сообщения: 95

СообщениеДобавлено: Пт Фев 20, 2015 11:38 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Таблички по миллиону записей. Я думаю не проблема создать у себя две таблицы с двумя полями и занести три записи.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
FedorinoFF



Зарегистрирован: 01.02.2007
Сообщения: 272
Откуда: Санкт-Петербург

СообщениеДобавлено: Вс Фев 22, 2015 2:48 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Nick4 писал(а):
Таблички по миллиону записей. Я думаю не проблема создать у себя две таблицы с двумя полями и занести три записи.

Ну-ну... Переубеждать не буду.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Nick4



Зарегистрирован: 15.10.2011
Сообщения: 95

СообщениеДобавлено: Пн Янв 25, 2016 5:01 pm    Заголовок сообщения: Проблема решена Добавить ответ со ссылкой на данный текст

Случайным образом решил проблему. В подзапросе надо добавлять group by (имя поля, по которому связываем). Например:
select * from b1 where id=any(select id_pasport from b2 group by id_pasport). В этом случае работает корректно.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
FedorinoFF



Зарегистрирован: 01.02.2007
Сообщения: 272
Откуда: Санкт-Петербург

СообщениеДобавлено: Вт Янв 26, 2016 10:42 am    Заголовок сообщения: Re: Проблема решена Добавить ответ со ссылкой на данный текст

[quote="Nick4"]Случайным образом решил проблему. В подзапросе надо добавлять group by (имя поля, по которому связываем). Например:
select * from b1 where id=any(select id_pasport from b2 group by id_pasport). В этом случае работает корректно.[/quote]
и не мудрено. если подумать о физическом смысле происходящего, то многое станет понятным:
1. group by уменьшает количество записей в выборке
2. уменьшение записей во вложенной выборке приводит к ускорению работы оператора any()

Дополнительно возникает вопрос: а зачем any() вообще?
почему в таблице b1 могут быть записи не ссылающиеся на b2?
нельзя выбрать все из b1 с не пустыми id?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Nick4



Зарегистрирован: 15.10.2011
Сообщения: 95

СообщениеДобавлено: Вт Янв 26, 2016 5:42 pm    Заголовок сообщения: Re: Проблема решена Добавить ответ со ссылкой на данный текст

FedorinoFF писал(а):
Nick4 писал(а):
Случайным образом решил проблему. В подзапросе надо добавлять group by (имя поля, по которому связываем). Например:
select * from b1 where id=any(select id_pasport from b2 group by id_pasport). В этом случае работает корректно.

и не мудрено. если подумать о физическом смысле происходящего, то многое станет понятным:
1. group by уменьшает количество записей в выборке
2. уменьшение записей во вложенной выборке приводит к ускорению работы оператора any()

Дополнительно возникает вопрос: а зачем any() вообще?
почему в таблице b1 могут быть записи не ссылающиеся на b2?
нельзя выбрать все из b1 с не пустыми id?


Есть цепь связанных таблиц: b1->b2->b3. Есть таблица b4, которая связана с b1 аналогично b2. Выборка должна быть в таблице b1, исходя из выборок таблиц b2, b4, b3. Поэтому сначала надо сделать выборки в b2, b4, b3, а потом исходя из полученного результата, в b1. Кроме того несколько раздражает несоотвествие описания и действующего функционала.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Top.Mail.Ru