powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / А такой запросик смогете?
13 сообщений из 13, страница 1 из 1
А такой запросик смогете?
    #32056519
типа гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две таблицы (t1, t2)
t1 - idt1 - индекс
- name - имя
t2 - idt2 - индекс
- idt1 - циферка для связи с t1
- info - некое поле которое может быть пустым а может и нет.

И так вопрос:
Забацать такой запрос, чтобы в результате были только те name для которых в t2 есть N непустых info.

Хе-хе!
А кто скажет - молодец!
...
Рейтинг: 0 / 0
А такой запросик смогете?
    #32056539
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могем
...
Рейтинг: 0 / 0
А такой запросик смогете?
    #32056544
типа гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И ГДЕ?
ОН
...
Рейтинг: 0 / 0
А такой запросик смогете?
    #32056545
Дима
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select * from t1 where
idt1 in (select idt2 from t2 where info is not NULL)
...
Рейтинг: 0 / 0
А такой запросик смогете?
    #32056554
Стрелок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот он

SELECT name
FROM t1
WHERE N=(
SELECT COUNT(*)
FROM t2
WHERE t2.idt1=t1.idt1 AND
t2.info IS NOT NULL)
...
Рейтинг: 0 / 0
А такой запросик смогете?
    #32056558
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это для Димы и Стрелка.
Дима, Вы невнимательно прочитали условие.
Стрелок, зачем так сложно?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
declare @N int
set @N= 1 
SET ANSI_WARNINGS OFF

select Name from t1
join t2 on t1.idt1=t2.idt1
group by name
having count(t2.info)=@N
...
Рейтинг: 0 / 0
А такой запросик смогете?
    #32056563
Стрелок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для Cat2
согласен, но
Код: plaintext
WHERE t2.info IS NOT NULL
разве не нужно?
Если для строки из t1 в t2 кроме N непустых будут ещё и пустые, то count выдаст NULL, так ведь?
...
Рейтинг: 0 / 0
А такой запросик смогете?
    #32056568
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, не надо. Строки с NULL игнорируются автоматом. Но что бы это работало, надо

Код: plaintext
SET ANSI_WARNINGS OFF
...
Рейтинг: 0 / 0
А такой запросик смогете?
    #32056583
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для Стрелка
Написал и подумал, что это на 100% справедливо для MS SQL 7.0 и старше. Во многих других случаях (в том числе для MS SQL 6.5), такое поведение при обработке NULL агрегатными функциями является единственно возможным. Но эксперимент, нужно ли делать проверку на NULL, не помешает. Возможно, что в некоторых СУБД без такой проверки будет выскакивать ошибка.
...
Рейтинг: 0 / 0
А такой запросик смогете?
    #32056879
типа гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А какой из этих 2-ух вариантов оптимизнутее?
У меня тестовая таблица мааааленькая и разницы не видно
...
Рейтинг: 0 / 0
А такой запросик смогете?
    #32056885
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для Типа_гостя.
Ну вот, наконец-то нормальный вопрос, а то какие-то предложения непонятные.

Запрос с HAVING будет выполняться быстрее, чем с подзапросом.

Но.
Если предположить, что поле idt1 однозначно определяет Name и по idt1 имеется индекс (как должно быть в правильно построеной базе), то самым быстрым будет

Код: plaintext
1.
2.
3.
select t1.idt1, max(Name) from t1
join t2 on t1.idt1=t2.idt1
group by t1.idt1
having count(t2.info)=@N
...
Рейтинг: 0 / 0
А такой запросик смогете?
    #32058506
типа гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А нельзя-ли для идиотов популярно объяснить логику работы этих двух запросов и конкретно почему один быстрее другого, а третий быстрее всех?

З.Ы. Даже если не объясните, то все равно спасибо за качественные ответы
...
Рейтинг: 0 / 0
А такой запросик смогете?
    #32058567
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для проверки, какой запрос лучше, нужно в QA включить опцию Show Query Plan. Сервер покажет, как он выполнил это запрос.

Запрос с подзапросом хуже, чем с HAVING потому, что подзапрос выполняется для каждого значения из t1. На моих таблицах он выполнялся в два раза медленнее. Агрегатирование выполняется значительно быстрее

Несколько сложнее с запросом с индексом и без него. При небольшом количестве строк, оптимизатор может дать одинаковый план, так как оптимизатор может принять решение не использовать индексы. Но группировка по индексу, особенно первичному, выполняется быстрее, чем по произвольному полю.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / А такой запросик смогете?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]