Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 предприятие повторяется по числу строк с продукцией. И я получаю список в котором одно предприятие дублируется. Есть ли другие методы выборки? Как можно решить поставленную задачу? |
|
Вернуться к началу |
|
|
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. |
|
Вернуться к началу |
|
|
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Ср Фев 18, 2015 1:18 am Заголовок сообщения: |
|
|
Я тоже понимаю, что должно быть так. Более того, если вместо select в скобках указать конкретные числа, то все работает корректно. Но если в скобках select, то проблема. У меня MI 12.0.2. |
|
Вернуться к началу |
|
|
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Ср Фев 18, 2015 5:53 pm Заголовок сообщения: |
|
|
Решил странным способ. Убрал индекс в первой таблице по id и все стало корректно. При добавлении птички в индекс по полю id, опят дублирует строки. ??? |
|
Вернуться к началу |
|
|
FedorinoFF
Зарегистрирован: 01.02.2007 Сообщения: 272 Откуда: Санкт-Петербург
|
Добавлено: Пт Фев 20, 2015 12:18 am Заголовок сообщения: |
|
|
Nick4, от чего таблички для примера не дали? можно было практически все проверить, а не на пальцах общаться... индексы они полезные, в принципе. |
|
Вернуться к началу |
|
|
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Пт Фев 20, 2015 11:38 am Заголовок сообщения: |
|
|
Таблички по миллиону записей. Я думаю не проблема создать у себя две таблицы с двумя полями и занести три записи. |
|
Вернуться к началу |
|
|
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). В этом случае работает корректно. |
|
Вернуться к началу |
|
|
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. Кроме того несколько раздражает несоотвествие описания и действующего функционала. |
|
Вернуться к началу |
|
|
|