Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопросы по использованию where и having 
V
    Опции темы
RockClimber
Дата 5.5.2008, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 848
Регистрация: 5.5.2006
Где: планета 013 в тен туре

Репутация: нет
Всего: 15



Начал изучать SQL недавно, пока активно вкуриваю мануалы, но не всегда получается...
Есть две таблицы в базе (postgree, если это имеет значение).
Код

CREATE TABLE system_login
(
...
  loginid bigserial NOT NULL,
  loginname text,
  filials text,
...
  )

CREATE TABLE data_clients
(
...
  locallogin bigint,
 ...
)

Полей на самом деле больше, но они не имеют значения. Мне нужно было построить запрос, который будет возвращать список сотрудников (поле loginname) определенного филиала (поле filials; номеров филиалов может быть несколько через запятую; в приведеннос примере - 20-й филиал) и количество закрепленных за каждым из них клиентов (список в таблице data_clients). Таблицы связаны по полям locallogin и loginid. Опытно-экспериментальным путем было установлено, что правильный результат возвращает такой запрос:
Код

select system_login.loginname, count(data_clients.locallogin)
from system_login, data_clients
where system_login.loginid = data_clients.locallogin 
group by system_login.loginname, system_login.filials
having system_login.filials ilike('%20%') or system_login.filials ilike('%20') or system_login.filials ilike('20%')
order by loginname

Я плохо понимаю, почему работает именно такой запрос. Если все условия перечислить после where или having, то результат не имеет никакого отношения к действительности. Чем они отличаются?


--------------------
Хорошо кинутый дятел далеко летит, крепко встревает, долго торчит.
PM MAIL GTalk   Вверх
Magnifico
Дата 5.5.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



where накладывает фильр(поиск) записей на основной запрос (без группировки)
а having  накладывает фильр(поиск) записей для группировки (group by)


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
skyboy
Дата 5.5.2008, 15:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



сначала выбираются все строки из всех указанных в секции from таблиц.
потом отбрасываются все строки, которые не удовлетворяют условиям в where.
потом происходит группировка по полям, указанным в group by.
потом обрасываются те записи результата, которые не удовлетворяют условиям в having
PM MAIL   Вверх
RockClimber
Дата 5.5.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 848
Регистрация: 5.5.2006
Где: планета 013 в тен туре

Репутация: нет
Всего: 15



О! Коротко и ясно! Спасибо! smile 


--------------------
Хорошо кинутый дятел далеко летит, крепко встревает, долго торчит.
PM MAIL GTalk   Вверх
skyboy
Дата 5.5.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



забыл: ещё в конце происходит сортировка smile
PM MAIL   Вверх
RockClimber
Дата 6.5.2008, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 848
Регистрация: 5.5.2006
Где: планета 013 в тен туре

Репутация: нет
Всего: 15



Ну уж про сортировку-то я и сам догадался smile 


--------------------
Хорошо кинутый дятел далеко летит, крепко встревает, долго торчит.
PM MAIL GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0446 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.