Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Выбрать первые 1 во вложенном запросе.  (Прочитано 40143 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Radistka
Помогающий

ru
Offline Offline
Пол: Женский

« : 11-04-2013 05:47 » 

чтото порыскала по форумам, вроде у народа получается, а как?- не понятно.
Справочник Сертификатов подчинён справочнику номенклатуры.

Код: (1C v8)
ВЫБРАТЬ
        СУММА(ПеремещениеНаРегионТовары.Количество) КАК Количество,
        ПеремещениеНаРегионТовары.Номенклатура,
        ПеремещениеНаРегионТовары.ЕдиницаИзмерения,
        ВложенныйЗапрос.Ссылка КАК Сертификат
ИЗ
        Документ.ПеремещениеНаРегион.Товары КАК ПеремещениеНаРегионТовары
                ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1
                        Сертификаты.Ссылка КАК Ссылка,
                        Сертификаты.НачалоДействияСертификата КАК НачалоДействияСертификата,
                        Сертификаты.Владелец КАК Владелец
                ИЗ
                        Справочник.Сертификаты КАК Сертификаты
                ГДЕ
                        (Сертификаты.НачалоДействияСертификата <= &ДатаДок
                                        ИЛИ Сертификаты.НачалоДействияСертификата = &Дата1)
                        И (Сертификаты.ДатаОкончанияДействия >= &ДатаДок
                                        ИЛИ Сертификаты.ДатаОкончанияДействия = &Дата1)
                        И Сертификаты.ТипСертификата = &ТипСертификата
               
                УПОРЯДОЧИТЬ ПО
                        НачалоДействияСертификата УБЫВ) КАК ВложенныйЗапрос
                ПО ПеремещениеНаРегионТовары.Номенклатура = ВложенныйЗапрос.Владелец
ГДЕ
        ПеремещениеНаРегионТовары.Ссылка.Ссылка В(&МассивДокументов)

СГРУППИРОВАТЬ ПО
        ПеремещениеНаРегионТовары.Номенклатура,
        ПеремещениеНаРегионТовары.ЕдиницаИзмерения,
        ВложенныйЗапрос.Ссылка

проблема в том что у номенклатуры может быть несколько активных сертификатов на дату документа. нам нужен тот, у которого дата начала действия самая поздняя. если убираем "Выбрать 1" то он берёт их все, если оставляем - не заполняет колонку с сылками на сертификаты. видела ещё вариант, когда пользуют максимум от даты начала действия сертификата, но вряд ли получится как-то сгруппировать по владельцу чтобы не группировать по ссылке. есть ещё варианты?
« Последнее редактирование: 11-04-2013 05:51 от Radistka » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 11-04-2013 07:02 » 

Radistka, ты бы сформулировала полней задачу.
Kivals, он способный, поймет. Но есть отдельные товарищи... которые в шоке от такого
 ГДЕ
     (Сертификаты.НачалоДействияСертификата <= &ДатаДок ИЛИ Сертификаты.НачалоДействияСертификата = &Дата1)
И  (Сертификаты.ДатаОкончанияДействия >= &ДатаДок          ИЛИ Сертификаты.ДатаОкончанияДействия = &Дата1)
Ладно... может так и надо..

А ты во вложенном запросе получаешь необходимое?

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Radistka
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #2 : 11-04-2013 07:14 » 

Radistka, ты бы сформулировала полней задачу.
Kivals, он способный, поймет. Но есть отдельные товарищи... которые в шоке от такого
......
А ты во вложенном запросе получаешь необходимое?

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

мне повезло - я могу заменить команду "первые 1" условиями и сделать много маленьких выборок, а из них в объединении получить результат,
вот так заработало:

Код: (1C v8)
ВЫБРАТЬ
        СУММА(ПеремещениеНаРегионТовары.Количество) КАК Количество,
        ПеремещениеНаРегионТовары.Номенклатура,
        ПеремещениеНаРегионТовары.ЕдиницаИзмерения,
        Сертификат.Ссылка
ИЗ
        Документ.ПеремещениеНаРегион.Товары КАК ПеремещениеНаРегионТовары
                ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                        Сертификаты.Ссылка КАК Ссылка,
                        Сертификаты.Владелец КАК Владелец,
                        Сертификаты.НачалоДействияСертификата КАК НачалоДействияСертификата
                ИЗ
                        Справочник.Сертификаты КАК Сертификаты
                ГДЕ
                        (Сертификаты.НачалоДействияСертификата <= &ДатаДок
                                        ИЛИ Сертификаты.НачалоДействияСертификата = &Дата1)
                        И (Сертификаты.ДатаОкончанияДействия >= &ДатаДок
                                        ИЛИ Сертификаты.ДатаОкончанияДействия = &Дата1)
                        И Сертификаты.ТипСертификата = &ТипСертификата) КАК Сертификат
                        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                                МАКСИМУМ(Сертификаты.НачалоДействияСертификата) КАК НачалоДействияСертификата,
                                Сертификаты.Владелец КАК Владелец
                        ИЗ
                                Справочник.Сертификаты КАК Сертификаты
                        ГДЕ
                                (Сертификаты.НачалоДействияСертификата <= &ДатаДок
                                                ИЛИ Сертификаты.НачалоДействияСертификата = &Дата1)
                                И (Сертификаты.ДатаОкончанияДействия >= &ДатаДок
                                                ИЛИ Сертификаты.ДатаОкончанияДействия = &Дата1)
                                И Сертификаты.ТипСертификата = &ТипСертификата
                       
                        СГРУППИРОВАТЬ ПО
                                Сертификаты.Владелец) КАК ДатаПоследнегоСертификата
                        ПО ДатаПоследнегоСертификата.НачалоДействияСертификата = Сертификат.НачалоДействияСертификата
                ПО ПеремещениеНаРегионТовары.Номенклатура = Сертификат.Владелец
ГДЕ
        ПеремещениеНаРегионТовары.Ссылка.Ссылка В(&МассивДокументов)

СГРУППИРОВАТЬ ПО
        ПеремещениеНаРегионТовары.Номенклатура,
        ПеремещениеНаРегионТовары.ЕдиницаИзмерения,
        Сертификат.Ссылка

а как вообще это решается, когда нельзя обойтись условиями, а надо именно взять один первый, или условий слишком много?

« Последнее редактирование: 11-04-2013 07:21 от Radistka » Записан
Radistka
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #3 : 11-04-2013 07:16 » 

А ты во вложенном запросе получаешь необходимое?

да, вложенный запрос, когда он не вложенный, а самостоятельный, работает норм. тут вопрос именно в порядке выполнения вложенных запросов )
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 11-04-2013 07:27 » 

>нам нужен тот, у которого дата начала действия самая поздняя. если убираем "Выбрать 1"

есть агрегатные функции min max
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Radistka
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #5 : 11-04-2013 08:00 » 

>нам нужен тот, у которого дата начала действия самая поздняя. если убираем "Выбрать 1"

есть агрегатные функции min max

да, но они действуют в пределах группировки. это я реализовала во втором сообщении )
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 11-04-2013 08:02 » 

Radistka, "первые 1" - возвращает один результат, а тебе (судя по условиям задачи, пришлось немного подняпрячь телепатические способности Улыбаюсь ) нужно "первый 1 для каждой номенклатуры". Если есть возможность - я бы делал это через временные таблицы (например, динамический список до сегодняшней версии 8.3.2 временные таблицы не поддерживает), а не через вложенный запрос, потому как будет нагляднее (и данные запроса 1 у нас используются дважды):

Запрос 1:
Получаем исходные данные (Номенклатура, ЕдиницаИзмерения, Количество) из ПеремещениеНаРегион.Товары

Запрос 2:
По данным из запроса 1 получаем соответствие Номенклатура и МАКСИМУМ(НачалоДействияСертификата), накладывая все условия на справочник сертификатов

Запрос 3 (самое важное):
По результатам запроса 2 (Номенклатура и НачалоДействияСертификата) получаем ссылки на сертификаты. Внимание! Комбинация Номенклатура + НачалоДействияСертификата должна быть уникальной для справочника сертификатов! Иначе придется еще раз использовать МИНИМУМ (или МАКИМУМ) на ссылку из справочника, при этом какой из одинаковых (по комбинации Номенлатура + НачалоДействияСертификата) элементов попадет в результат - определить заранее невозможно. Результат запроса: соответствие Номенклатура и Сертификат

Запрос 4 (результат):
Делаем левое соединение Запрос 1 и Запрос 3

P.S. Аналогичные приемы подходят для получения хитрых срезов периодических регистров сведений

Добавлено через 1 минуту и 20 секунд:
P.P.S. А что касается что отвечаю в основном я - ну так читают ответы я надеюсь многие Ага Глядишь - кому-то еще пригодится консультация, если задача будет понятна
« Последнее редактирование: 11-04-2013 08:05 от Kivals » Записан
Radistka
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #7 : 11-04-2013 08:14 » 

да, прошу прощения, забыла уточнить. моя печаль - я работаю на 1С:Предприятие 8.1 (8.1.15.14). я штатник и конфа на столько переписана что для 8.3 мне прийдётся через годик, когда разберусь с переписками, писать с нуля на новую платформу..
Записан
Алёна
Молодой специалист

ru
Offline Offline
Блондинка...


WWW
« Ответ #8 : 11-04-2013 10:53 » 

Читаем.. читаем.... и даже пытаемся понять Улыбаюсь

Я сейчас честно обложилась желтенькими книжками Улыбаюсь но как всегда жду волшебного пенедля...
Записан

Стену можно пробить только головой. Все остальное орудия.
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 11-04-2013 13:08 » 

Radistka, я вроде не написал ничего, что не пошло бы на 8.1 - только в исключениях. Временные таблицы есть уже в 8.1.
В принципе твой второй запрос практически полностью реализует то, что я написал, кроме следующих моментов:
1) делает это во вложенных запросах, вместо временных таблиц у меня. На мой взгляд это снижает читабельность, но какой вариант эффективнее - не знаю, это только проверять на реальных данных.
2) лишний раз используются условия (достаточно все условия "где" указать в запросе с МАКСИМУМ)

Добавлено через 52 секунды:
Алёна, если Radistka не поленится, и напишет реальные запросы по моим рекомендациям - думаю тогда будет понятнее Ага
« Последнее редактирование: 11-04-2013 13:09 от Kivals » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 11-04-2013 13:38 » 

Kivals, временные таблицы - это на момент расчета?
А чем тогда , грубо говоря, подзапрос отличается от временной таблицы?

С другой стороны - все зависит от объемов и нагруженности системы, и частоты таких запросов
Если это все работает на MS SQL, то может проще построить view?

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 11-04-2013 14:05 » 

Sla, 1с сама ретранслирует код запросов в sql, т.к. база может быть на MS SQL, Oracle, IBM DB2, PostgreSQL и во внутреннем файловом формате 1С.

Временные таблицы реально создаются в БД (create temporary table), потому в принципе могут тормозить работу, вложенные запросы по-моему не создают временных таблиц.
Но в варианте с временными таблицами во втором запросе мы отбираем сертификаты только тех записей, которые есть по условиям задачи: из Документ.ПеремещениеНаРегион.Товары где ПеремещениеНаРегионТовары.Ссылка.Ссылка В(&МассивДокументов), а в варианте с вложенными таблицами мы шерстим всю таблицу справочника и отбираем нужные только на завершающем этапе ЛЕВОЕ СОЕДИНЕНИЕ (LEFT JOIN). Потому что будет эффективнее зависит от настроек БД (временные таблицы можно настроить в памяти) и количества данных в таблице Справочник.Сертификаты
Записан
Radistka
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #12 : 12-04-2013 03:36 » 

щас с текущими раскидаюсь с утра и в конце рабочего дня попробую сделать пример из временных таблиц..(кстати можно как-то в СКД реализовывать временные таблицы? а то я так привыкла всё в консоли тестить)

Оффтоп, в поисках истины: мне вот всё интересно было, когда 8.2 только появилсь то временные таблицы помню сильно нашумели тем что действительно физически создаются в каком то виде и где то хранятся и 1Ска их за собой не чистит. но я тогда только начинала 1С изучать и все эти умные слова мне были непонятны.. сейчас всё это в форумах давно ушло в архивы и не найти, а очень хочется сейчас вот разобраться что же они всё таки создают за файлы, чистит ли диски от них винда, или сама 1Ска или ещё чтото? это же вероятно какие то темпы должны быть? где бы ликбез получить? а то временными таблицами сейчас стала появляться необходимость пользоваться время от времени, а сервера у нас мощные только центральные, а в филиалах до смешного(2,49Гб оперативки и на этом ещё и Скуль вертится и по 10 пользователей подключается одновременно)
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 12-04-2013 07:12 » 

>а в филиалах до смешного(2,49Гб оперативки и на этом ещё и Скуль вертится и по 10 пользователей подключается одновременно)
Не показатель нагрузки.
10 пользователей одновременной работы или коннектов.

По опыту знаю 2гб + 4 юзера одновременной работы (не 1С), но количество таблиц и запросов сопоставимо с 1С - и ни гу-гу, все работает, архитектура - клиент-сервер. Да... проблемы возникали, но на очень больших отчетах (большой период)
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Radistka
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #14 : 12-04-2013 10:21 » 

я не разбираюсь во взаимодействии сервера с пользователями, но процесс rphost  который на таких "серверах" выжирает всю оперативку под ноль и пользователи просто не могут с базу запрашивать данные, потому что выборка данных идёт ооочень медленно - меня угнетает это и заставляет лишний раз к базе не кидаться. ой как хочется на управляемые формы, в надежде что наконец то огромные куски кода перепишутся и будут обрабатываться на клиенте.. а вдруг полегчает.. почему то на 8+Гб оперативки такая проблема возникает не раз в неделю а раз в два-три месяца. может так настроен Скуль неудачно или сервер 1С?
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 12-04-2013 10:37 » 

Offtopic:
Sla, да и просто сказать "10 пользователей 1С" тоже не показатель. Количество таблиц в самой простой конфе (например, Деньги) и в самой сложной (УПП) отличается почти на 2 порядка (60 таблиц в Деньгах vs. более 3000 в УПП)...
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 12-04-2013 10:40 » 

Radistka, в управляемых формах как раз наоборот - все переброшено на сервер, на клиенте по сути только интерфейс обрабатывается. Хотя и оптимизирована работа сервера в более новых версиях.
А вообще-то свои рабочие сервера я ставлю в ежедневный перезапуск службы, чтобы не было утечек памяти (т.к. утечками страдают все виденные мною версии 8ки)
Записан
Radistka
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #17 : 12-04-2013 10:51 » 

таблиц 400 наверное от силы, документооборот большой, базы по 10гигов минимум. базам от недели до двух лет, РИБ. пока тоже решаем перезапуском службы, но возникает потребность сейчас не так часто - как-то обмены расписание подгадали или может звезды в другом порядке, ночью идут обмены даными по товарным регистрам накопления, на некоторых базах по 5 часов обмен идёт. разброс в часовых поясах у пользователей 6 часов. т.е. я уже домой собираюсь а ктото ещё на обед не ходил.

и всё таки, где бы обликбезиться по поводу временных таблиц,  1Совские брошюрки иногда неправдивы или недоговаривают.
« Последнее редактирование: 12-04-2013 10:53 от Radistka » Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 12-04-2013 15:09 » 

На счет "где почитать" про временные таблицы: я уже не помню где выцепил. Попробуй пошерстить поиском google по www.gilev.ru
« Последнее редактирование: 12-04-2013 15:14 от Kivals » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 12-04-2013 16:40 » new

блИИИн. Гилеву 100500 респектов.... очень много ссылок на него.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines