• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Запрос Помогите Сделать

  • Автор темы Дайнеко
  • Дата начала
Статус
Закрыто для дальнейших ответов.
Д

Дайнеко

Хочу выбрать из спр-ка Клиентов элементы, НЕ участвовавшие в документах.
Код:
ВЫБРАТЬ
Клиенты.Ссылка КАК СсылкаКли,
Контакт.Ссылка КАК СсылкаДок
ИЗ
Справочник.Клиенты КАК Клиенты
ПРАВОЕ СОЕДИНЕНИЕ Документ.Контакт КАК Контакт
ПО (Контакт.Клиент = Клиенты.Ссылка)
ГДЕ
Клиенты.Родитель = &Родитель
И Контакт.Дата МЕЖДУ &ДатаН И &ДатаК

Понимаю так, что надо поставить условие на "СсылкаДок" равен null. Но даже в этом запросе я ожидал, что получу ВСЕ записи клиентов и у некоторых будут пустые ссылки на документы. Но в итоге я получаю только несколько строк, задействованных в документах.
 
M

-master-

значит по условию не проходят остальные
 
U

unknown181538

Во-первых, я не понял, нужно ли получить клиентов , ссылки на которые есть в документах, не входящих в интервал.
"Понимаю так, что надо поставить условие на "СсылкаДок" равен null. Но даже в этом запросе я ожидал, что получу ВСЕ записи клиентов и у некоторых будут пустые ссылки на документы." - помните, что условие в секции ГДЕ накладывается логически после соединений. Null явно не входит в интервал.
В данном случае, похоже, что условие на вхождение в интервал надо перенсти в секцию ПО, а в секции ГДЕ сделать условие ЕСТЬ NULL.

Добавлено: А что за экзамен-то?

Добавлено: И еще одна ошибка - соединение не правое нужно, а левое, чтобы клиентов вы получали всех.
 
Д

Дайнеко

А что за экзамен-то?
Да прикалываюсь я.

Добавлено: [/b]И еще одна ошибка - соединение не правое нужно, а левое, чтобы клиентов вы получали всех.
Я так сначала и сделал. Ка-то внешне результат одинаковый

Повторю задание:
- Клиенты нужны из всего спр-ка (группы)
- кроме тех, кто встречается в документах (только этого интервала)
Цель Запроса - мертвые клиенты.

Я думаю, что принципиально ГДЕ не подходит. Должен быть отдельный набор, построенный по документам, а потом вторым щагом набор из спр-ка отсеивается. Придется почитать синтаксис, искать слова "Входит" "В" и т.д.
 
U

unknown181538

ВЫБРАТЬ
Клиенты.Ссылка КАК СсылкаКли,
Контакт.Ссылка КАК СсылкаДок
ИЗ
Справочник.Клиенты КАК Клиенты
Левое СОЕДИНЕНИЕ Документ.Контакт КАК Контакт
ПО (Контакт.Клиент = Клиенты.Ссылка)
И( Контакт.Дата МЕЖДУ &ДатаН И &ДатаК)
ГДЕ
Клиенты.Родитель = &Родитель
И Контакт.ссылка ЕСТЬ Null
 
P

puh14

ИЗВЕРГИ! Зачем вам эти джойны в этой задаче?

Код:
Выбрать Клиенты.Ссылка 
из 
Справочник.Клиенты КАК Клиенты
ГДЕ
Клиенты.Родитель = &Родитель // тут может таки в иерархии??
и не Клиенты.ссылка в (Выбрать Различные Контакт.Клиент из Документ.Контакт КАК Контакт где Контакт.Дата МЕЖДУ &ДатаН И &ДатаК)
 
U

unknown181538

"ИЗВЕРГИ! Зачем вам эти джойны в этой задаче?"
А что, вложенный запрос лучше джойна?
 
P

puh14

"ИЗВЕРГИ! Зачем вам эти джойны в этой задаче?"
А что, вложенный запрос лучше джойна?

А кстати интересный вопрос! Только чтоб проверить, выборка должна быть здоровенная.
 
Д

Дайнеко

Ну что, парни! Проверил.

Спасибо unknown181538 и puh14. Вариант unknown181538 ближе к моим исходным мыслям, просветил меня по условию. Теперь понимаю, почему в результатах не было Null. Вариант puh14 соответствует альтернативной мысли.

Разбор полетов:
1) Оба выдали одинаковый результат. Ставлю обоим зачет :(
2) А теперь самое удивительное. По скорости. Дал запрос за год, клиентов до 1 тысячи, документов около 3-4 тыс. база файловая.
Предполагал, что в силу простоты вариант unknown181538 быстрее. Ну, думаю, а puh14 похвалю тем, что его вариант красивше, особенно, если понадобится делать анализ не по одному виду документов.
А нетушки! puh14 бегал молниеносно! Консоль просто моргала и выдавала результат. А unknown181538 замирал на 1-2 секунды.
Честное слово - сам не ожидал! Я как-то не раз задумывался над вложенными запросами. И этот пример - хороший урок.
 
M

-master-

Предполагал, что в силу простоты вариант unknown181538 быстрее
В силу простоты ничего не бывает, надо смотреть на индексы и планы выполнения. И тогда делать выводы.
Вложенные запросы по своей сути уже зло, т.к. это овер. Но не все так просто.

А тут еще играет то что - клиентов до 1 тысячи, документов около 3-4 тыс., но не сильно должно сказыватся на производительность, т.к. всеже данных и там и там ничтожно мало.
 
U

unknown181538

Есть еще вариант с индексированной временной таблицей, но тогда он гарантировано сначала считает ее полностью, а в варианте со вложенным запросом, возможно, соптимизирует.
Поэтому, на мой взгляд, вложенный запрос может даже оказаться быстрее.
Имхо, опять же, вложенный запрос - зло с точки зрения читабельности, но тут запрос маленький.
А еще нужно помнить про кэширование. Не факт, что Дайнеко это учел)
 
Д

Дайнеко

Вложенные запросы по своей сути уже зло.
Имхо, опять же, вложенный запрос - зло с точки зрения читабельности, но тут запрос маленький.

Эй, мальчиши-кибальчиши! Че так зло набросились? :huh:
Читабельность - важнейшая для меня штука. И на пуховский вариант по этому поводу не плюнешь. Весьма очевидно: шаг первый - просмотрели доки, шаг второй - приложили их к клиентам. Человек руками делал бы так-же.

А тут о быстродействии подумал. Только отбросим всякие индексы и кэши в строну. Наверное, все-таки есть более резонная причина.
Поставьте себя на место сервера.
Вариант 2 (специально с конца рассмотрю). Просмотрел доки - сделал список клиентов, сплющил в уникальный набор. А потом занялся объединение двух, относительно небольших, списков клиентов.
Вариант 1 Взял первого клиента, к нему поискал его доки, взял второго - опять пересмотрел доки. И т.д. Значит пересмотров будет много. А ускоряющие примочки дело не поправят. Да и не будешь индексировать все реквизиты документов ради отчета редкого анализа.

Вывод: скорость геометрически зависит от размеров объединяемых множеств. Объединение 1тыс и 4 тыс. будет дольше чем 1тыс на 1 тыс не в 4 раза, а, грубо говоря, в 16 минус оптимизация примочек. Т.е. раз в 10.
 
M

-master-

Человек руками делал бы так-же.
Человек может и так, а вот оптимизатор не смотрит на как бы человек сделал.

Добавлено:
Только отбросим всякие индексы и кэши в строну
Тогда идите коровам хвосты крутить. При работе с базами это одно из важных моментов, отбросив его - туда летит и база.
 
M

-master-

Еще один мальчик беструсый. и где вас только выпускают?
Вы бы лучше прислушались да почитали про что говорят, чтоб в дальнейшем грамотнее быть и пургу не нести... да и для работы полезно
 
Д

Дайнеко

Я-то сообщение сразу увидел. Но ответа в таком-же духе не будет.
 
P

puh14

Наберите в любой типовой конфе в поиске "(Выбрать" и увидите частоту использования вложенных запросов. Сомневаюсь, что разработчики идиоты. Так что данный способ право на существование имеет.
 
M

-master-

Никто не говорил что вложенные нельзя юзать, речь лишь о том что сами по себе они зло, но в некоторых случаях необходимое.
Сомневаюсь, что разработчики идиоты
кто его знает, может и идиоты... сомнения - удел невест.
 
P

puh14

Ну тогда поучите разработчиков как им работать, глядишь что толковое выйдет.
 
M

-master-

И тут есть кого поучить. Тут даже прикольнее. :huh:
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!