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

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

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

SELECT name
FROM t1
WHERE N=(
SELECT COUNT(*)
FROM t2
WHERE t2.idt1=t1.idt1 AND
t2.info IS NOT NULL)
...
Рейтинг: 0 / 0
08.10.2002, 23:00
    #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
08.10.2002, 23:35
    #32056563
Стрелок
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А такой запросик смогете?
Для Cat2
согласен, но
Код: plaintext
WHERE t2.info IS NOT NULL
разве не нужно?
Если для строки из t1 в t2 кроме N непустых будут ещё и пустые, то count выдаст NULL, так ведь?
...
Рейтинг: 0 / 0
08.10.2002, 23:57
    #32056568
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А такой запросик смогете?
Нет, не надо. Строки с NULL игнорируются автоматом. Но что бы это работало, надо

Код: plaintext
SET ANSI_WARNINGS OFF
...
Рейтинг: 0 / 0
09.10.2002, 07:16
    #32056583
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А такой запросик смогете?
Для Стрелка
Написал и подумал, что это на 100% справедливо для MS SQL 7.0 и старше. Во многих других случаях (в том числе для MS SQL 6.5), такое поведение при обработке NULL агрегатными функциями является единственно возможным. Но эксперимент, нужно ли делать проверку на NULL, не помешает. Возможно, что в некоторых СУБД без такой проверки будет выскакивать ошибка.
...
Рейтинг: 0 / 0
09.10.2002, 19:22
    #32056879
типа гость
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А такой запросик смогете?
А какой из этих 2-ух вариантов оптимизнутее?
У меня тестовая таблица мааааленькая и разницы не видно
...
Рейтинг: 0 / 0
09.10.2002, 20:28
    #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
15.10.2002, 17:39
    #32058506
типа гость
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А такой запросик смогете?
А нельзя-ли для идиотов популярно объяснить логику работы этих двух запросов и конкретно почему один быстрее другого, а третий быстрее всех?

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

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

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


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