Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 09.06.2010
Сообщений: 4
1

Реализация вложенного запроса

09.06.2010, 10:56. Просмотров 757. Ответов 8
Метки нет (Все метки)

Помогите с задачей. Есть 3 таблицы. Склады(storage)
, арендаторы(tenantry) , договора_аренды(contract_rent) . Нужно найти всех орендаторов у которых договора на оренду только одного склада, только 2х и более складов. С какой стороны к этому подступиться?
Поля: склады(id), арендаторы (id), договора_аренды(id,storage_id, tenantry_id)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2010, 10:56
Ответы с готовыми решениями:

Как избавится от второго одинакового вложенного запроса?
SELECT x FROM TABLE1 WHERE y=(SELECT y FROM TABLE2 WHERE z=u) AND v=(SELECT y FROM...

Создание вложенного запроса
Просьба помочь создать запрос для следующей задачи. В БД есть строки со следующими полями: id |...

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

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

8
40 / 39 / 4
Регистрация: 26.05.2010
Сообщений: 210
09.06.2010, 12:43 2
selec id from tenantry join contract_rent on contract_rent.tenantry_id==ten antry.id where count(contract_rent.storage_id )==1
хотя в синтаксисе сомневаюсь...
0
683 / 239 / 13
Регистрация: 02.04.2009
Сообщений: 692
09.06.2010, 12:55 3
Примерно так. Мог ошибится.
SQL
1
2
3
SELECT t.id 
FROM storage s,tenantry t,contract_rent cr
WHERE s.id=cr.storage_id AND t.id=tenantry_id AND COUNT(cr.storage_id)=1
1
0 / 0 / 0
Регистрация: 09.06.2010
Сообщений: 4
09.06.2010, 13:23  [ТС] 4
хотя в синтаксисе сомневаюсь...
синтаксис вроде так должен быть
T-SQL
1
2
3
4
select tenantry.id from tenantry 
join contract_rent on contract_rent.tenantry_id=tenantry.id
group by tenantry.id
having count(contract_rent.storage_id)=1
такой подход применим если есть только 1 договор на оренду склада. Как сделать выборку при условии, что может быть несколько договоров на один и тот же склад?т.е. у одного арендатора 5 договоров и все на один склад а у другого 3 договора и все на разные склады, нужно выбрать, того у которого складов 1, больше одного не зависимо от количества договоров.
0
36 / 16 / 0
Регистрация: 29.01.2010
Сообщений: 252
09.06.2010, 13:28 5
SQL
1
2
3
4
5
SELECT * 
FROM tenantry a INNER JOIN contract_rent c ON a.id=c.tenantry_id INNER JOIN storage b ON b.id=c.storage_id
GROUP BY 
a.id, a.name_tenantry
HAVING COUNT(a.id)="+textbox1.text;
где textbox1 это поле в проге, гед вводится желаемое количество складов!
Если без ввода, то
SQL
1
2
3
4
5
SELECT a.id, a.name_tenantry 
FROM tenantry a INNER JOIN contract_rent c ON a.id=c.tenantry_id INNER JOIN storage b ON b.id=c.storage_id
GROUP BY 
a.id, a.name_tenantry
HAVING COUNT(a.id)=1

Внимательно никогда не пишите условия связи таблиц в where грамотный преподаватель вам за ето бал как минимум снизит
lда группировку обязательно делать надо и в having условие
0
0 / 0 / 0
Регистрация: 09.06.2010
Сообщений: 4
09.06.2010, 13:51  [ТС] 6
Цитата Сообщение от dontgiveafk Посмотреть сообщение
"select *
From tenantry a inner join contract_rent c on a.id=c.tenantry_id inner join storage b on b.id=c.storage_id
group by
a.id, a.name_tenantry
having count(a.id)="+textbox1.text;

где textbox1 это поле в проге, гед вводится желаемое количество складов!
Если без ввода, то

select a.id, a.name_tenantry
From tenantry a inner join contract_rent c on a.id=c.tenantry_id inner join storage b on b.id=c.storage_id
group by
a.id, a.name_tenantry
having count(a.id)=1


Внимательно никогда не пишите условия связи таблиц в where грамотный преподаватель вам за ето бал как минимум снизит
lда группировку обязательно делать надо и в having условие

Ваш запрос так же не учитывает то, что может быть несколько договоров по одному складу. Тут count(a.id) по сути возвращает количество договоров а не кличество арендуемых складов.
0
36 / 16 / 0
Регистрация: 29.01.2010
Сообщений: 252
09.06.2010, 13:51 7
oh main god! Прочитайте про inner join повнимательней! в книгах по sql! все он выдаст можно вообщето дописать

да с группировкой тут еще надо вот так сделать

select a.id, a.name_tenantry, b.id as id_storage
From tenantry a inner join contract_rent c on a.id=c.tenantry_id inner join storage b on b.id=c.storage_id
group by
a.id, a.name_tenantry,b.id
having count(b.id)=1
0
0 / 0 / 0
Регистрация: 09.06.2010
Сообщений: 4
09.06.2010, 14:53  [ТС] 8
Цитата Сообщение от dontgiveafk Посмотреть сообщение
oh main god! Прочитайте про inner join повнимательней! в книгах по sql! все он выдаст можно вообщето дописать
хорошо, рассмотрим пример
данные в таблице contract_rent
id |tenantry_id|storage_id
1 1 1
2 1 1
3 1 1
4 2 1
5 2 2
6 2 3
7 3 1
8 3 1
9 3 1
10 3 2

в таблицах storage и tenantry id = [1,2,3]

результат выполнения запроса
Код
select a.id as tenantry_id,count(b.id) as count
From tenantry a 
inner join contract_rent c on a.id=c.tenantry_id 
inner join storage b on b.id=c.storage_id
group by
a.id, b.id
having count(b.id)=1
tenantry_id|count
2 | 1
2 | 1
2 | 1
3 | 1
по условию "вывести всех арендаторов, у которых договор только на 1 склад" должен вывести
tenantry_id|count
1 1
так как у арендатора "1" 3 договора на один и тот же склад
по условию "вывести всех арендаторов, у которых договор на 2 и более складов" должен вывести
tenantry_id|count
2 3
3 2
так как у арендатора "2" 3 договора на 3 склада, у арендатора "3" 3 договора на склад "1", что есть 1 склад
+ один договор на склад "2" итого count = 2
0
36 / 16 / 0
Регистрация: 29.01.2010
Сообщений: 252
09.06.2010, 16:59 9
Цитата Сообщение от dontgiveafk Посмотреть сообщение
having count(a.id)="+textbox1.text;
вот если подставлять разные значения, то нужно определиться во первых откуда их брать! если из программы то вместо 1 должен стоять element.text или какое свойство там используется у элемента ввода

Добавлено через 11 минут
что- то не так что понять не могу
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2010, 16:59

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Составление вложенного SQL запроса
С использованием вложенных запросов в операторе HAVING, найти количество читателей ...

Обращение к полю из вложенного запроса
Есть запрос, который выводит информацию об объекте, который связан с максимальным числом объектов...

Подстановка результата вложенного запроса в INSERT INTO
Всем доброго времени суток. У меня имеется таблица catalog, в ней есть 2 столбца: id_title и...

Ошибка при создании вложенного запроса
Создаю запрос для вывода всех различных значений по полю ProizvTovara, но выбивает ошибка:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.