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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> sql запрос 
:(
    Опции темы
mgf
  Дата 13.10.2011, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 23.4.2009

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



Добрый вечер! Очень нужна помощь в составлении sql запроса! Суть такова: в каждом доме проживает несколько человек. 
Таблица 1: человек с датой рождения и датой смерти
таблица 2: номер дома, id человека, проживающего в нем, прописка(с какого числа проживает), дата выписки ( в случае смерти), в одном доме могут быть прописаны как умершие, так и живые люди.
Надо учесть, что некоторых умерших просто забыли выписать из дома. 

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

Это сообщение отредактировал(а) mgf - 14.10.2011, 00:15
PM MAIL   Вверх
AndreyIQ
Дата 14.10.2011, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 3
Всего: 8



Цитата(mgf @ 13.10.2011,  23:36)
Добрый вечер! Очень нужна помощь в составлении sql запроса! Суть такова: в каждом доме проживает несколько человек. 
Таблица 1: человек с датой рождения и датой смерти
таблица 2: номер дома, id человека, проживающего в нем, прописка(с какого числа проживает), дата выписки ( в случае смерти), в одном доме могут быть прописаны как умершие, так и живые люди.
Надо учесть, что некоторых умерших просто забыли выписать из дома. 

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

Вы уверены что у Вас в таблице2 - поле ид человека, а не в таблице1 - поле ид дома.
PM MAIL   Вверх
Zloxa
Дата 14.10.2011, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



AndreyIQ, дома к человеку относятся многие ко многим, наверняка таблица2 реализует эту связь

Код

select ИД_Дома
from Таблица2 t2
left join Таблица1 t1 on t2.ИдЧеловека = t1.ИдЧеловека 
group by ИД_Дома
having count(case when t2.ДатаВыписки is not null and t1.ДатаСмерти is null then 1 end) = 0



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
AndreyIQ
Дата 14.10.2011, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 3
Всего: 8



Цитата(Zloxa @ 14.10.2011,  09:07)
AndreyIQ, дома к человеку относятся многие ко многим, наверняка таблица2 реализует эту связь

Для связи много ко многим, должна быть промежуточная таблица.

Это сообщение отредактировал(а) AndreyIQ - 14.10.2011, 09:31
PM MAIL   Вверх
Zloxa
Дата 14.10.2011, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(AndreyIQ @  14.10.2011,  09:30 Найти цитируемый пост)
 должна быть промежуточная таблица.

Я так понимаю это она и есть, т.к. дата прпописки и дата выписки - нуникак не атрибуты сущности Дом ))


Это сообщение отредактировал(а) Zloxa - 14.10.2011, 09:36


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
mgf
Дата 14.10.2011, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 23.4.2009

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



Могу привести полные таблицы.. там, конечно много лишнего. Но выглядит так:
таблица 1:
id_человека, дата рождения, дата смерти, ИНН, адрес и т.д.
таблица 2(факт проживания):
id_объекта (дома), дата прописки, id_человека, дата выписки, примечание
таблица 3(объект-дом):
id_объекта, номер дома, общая площадь и т.д.


Поясните пожалуйста, что выполняет последняя строка в запросе? Делаю проверку в access, пишет, что пропущен оператор. Условие, проверяемое на пустые строки понятно, а для чего нужен count? И что в данном случае выполняет case 

Это сообщение отредактировал(а) mgf - 14.10.2011, 15:33
PM MAIL   Вверх
Zloxa
Дата 14.10.2011, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Выражение в case вернет еденичку, в случае, если в доме прописан жилец. count эти еденички посчитает для каждого дома. Нам нужны те дома, где нет проживающих жильцов. как это переписать под акцесс, я не знаю.

С учетом появления третьей таблицы, наверное следовало бы выбираться из нее, а Таблицу2 соединять левым соединением. Иначе у нас из выборки выпадут те дома, где никто никогда прописан не был.

Это сообщение отредактировал(а) Zloxa - 14.10.2011, 16:04


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
AndreyIQ
Дата 14.10.2011, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 3
Всего: 8



Если ни где ни тупанул (пятница, вечер), то как то так:
Код

select distinct Дома.* from Дома 
left join Факт_проживания on Дома.id_дома = Факт_проживания.id_дома 
join Человеки on Факт_проживания.id_человека = Человеки.id_человека 
where Человеки.дата_смерти is null and Факт_проживания.дата_выписки is null
and Человеки.id_человека is null

PM MAIL   Вверх
Zloxa
Дата 14.10.2011, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(AndreyIQ @  14.10.2011,  15:56 Найти цитируемый пост)
то как то так:

Нет, не так ))
Благодаря условию Человеки.id_человека is null ты получишь только те дома, где никогда не были прописаны человеки, остальные условия можно и не проверять.

Добавлено @ 16:11
Можно сделать через нотэкзистс

Код

select * 
from дома 
where not exists (select null 
                   from проживающие 
                   left join человеки on проживающие.человек = человеки.человек
                   where проживающие.дом = Дома.дом 
                     and (проживающие.дата_выписки is null 
                          or человеки.дата_смерти is not null
                         )
                 )


Это сообщение отредактировал(а) Zloxa - 14.10.2011, 16:34


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
AndreyIQ
Дата 14.10.2011, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 3
Всего: 8



Цитата(Zloxa @ 14.10.2011,  16:09)
Нет, не так ))

Прочитал свой запрос, действительно хрень какую-то написал.
Цитата

Можно сделать через нотэкзистс

Можно. Темболее наверняка лучше моего запроса сработает smile 
ЗЫ ИМНО ексисты лучше не использовать, тормознутые они.
PM MAIL   Вверх
Zloxa
Дата 14.10.2011, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(AndreyIQ @  14.10.2011,  16:20 Найти цитируемый пост)
ЗЫ ИМНО ексисты лучше не использовать, тормознутые они. 

Мне кажется тут ты обобщаешь очень частный случай ))
Если акцесс не умеет строить приемлемого плана для экзистов, то лучше ограничить скоп высказывания именно акцессом.

Это сообщение отредактировал(а) Zloxa - 14.10.2011, 16:24


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
AndreyIQ
Дата 14.10.2011, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 3
Всего: 8



Цитата(Zloxa @ 14.10.2011,  16:23)
Если акцесс не умеет строить приемлемого плана для экзистов, то лучше ограничить скоп высказывания именно акцессом.

Я в акцесе почти не работаю, в основно на firbird'e
PM MAIL   Вверх
mgf
Дата 14.10.2011, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 23.4.2009

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



спасибо! Очень помогли, таблицы имеют неудобную структуру, поэтому сама запуталась как это все в итоге вывести.
PM MAIL   Вверх
Zloxa
Дата 14.10.2011, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(mgf @  14.10.2011,  16:57 Найти цитируемый пост)
сама запуталась

 smile 


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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