powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Помогите составить запрос... 3-й днь сижу.
17 сообщений из 17, страница 1 из 1
Помогите составить запрос... 3-й днь сижу.
    #35011765
Vladimir_Mi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пипл не то чтобы я полный чайник, но три дня не могу осилить запрос (а курсач как вы понимаете не ждет). Ситуация такая... учебная БД... про самолеты (в приложенном файлике структурка).
Запрос звучит следующим образом: выбрать
Самолет(ы) с более чем двумя типами ракет и более чем двумя типами пушек и с
наименьшим (из этих самолетов) количеством экипажа. Вывести название
самолета и численность экипажа. Упорядочить по названию самолета.

Куча вариантов и ни один не рабатет как надо =(
Замучался читать мануалы и искать экзотические функции.... мож у кого будет время разобраться. SQL FOREVER
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35011772
Vladimir_Mi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35011773
Vladimir_Mi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35011775
Vladimir_Mi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35012186
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Вы бы не картинки привели, а несколько запросов, которые создают Ваши таблицы и заполняют их тестовыми данными. Никто не будет по вашим карикатурам создавать базу и заполнять ее.

Причем этот вопрос лучше всего направить не в Проектирование, а в форум по скуль-серверу, который Вы используете. К проектированию Ваш вопрос оностится мало.

Итак, если вы ходите получить ответ.
1. Напишите запросы, которые создают спроектированные Вами таблицы
2. Напишите запросы, которые заполняют их тестовыми данными




+++++
Автоподпись - Близкий друг королевы Задолбало.
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35012613
drev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой сервер БД?
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35012625
Vladimir_Mi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сервак PostgreSQL, вот запросы на создание БД.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
CREATE TABLE "info_missiles"(
"name" char( 6 ) NOT NULL,
"type" text DEFAULT 'unknown' CHECK(type in ('air-air', 'air-ground', 'unknown')),
"pointing" text DEFAULT 'unknown' CHECK(pointing in('mechanical', 'radio-locating', 'laser', 'thermal', 'unknown')),
"power" int CHECK(power> 0 ),
"distance" int CHECK(distance> 0 ),
PRIMARY KEY(name)
);


CREATE TABLE "info_guns"(
"name" char( 6 ),
"type" text DEFAULT 'unknown' CHECK(type in('revolver', 'belt', 'disk', 'rotate_block', 'unknown')),
"distance" int CHECK(distance> 0 ),
"calible" int CHECK(calible> 0 ),
PRIMARY KEY(name)
);


CREATE TABLE "types_aircraft"(
"id" char( 5 ),
"type" text CHECK(type in('fighter', 'bomber', 'transport', 'recon', 'flyingboat')),
"first_model" text DEFAULT 'unknown',
"year_first_model" int CHECK(year_first_model> 1928  AND year_first_model< 2010 ),
"first_designer" text DEFAULT 'unknown',
"max_speed" int CHECK(max_speed> 0 ),
"max_distance" int CHECK(max_distance> 0 ),
PRIMARY KEY(id), 
UNIQUE(type), UNIQUE (first_model)
);



CREATE TABLE "organizations_creator"(
"id" char( 5 ),
"name" text NOT NULL,
"year_foundation" int CHECK(year_foundation> 1928 ),
"founder" text,
"years_of_life" text DEFAULT 'unknown',
"rank" text DEFAULT 'unknown',
PRIMARY KEY(id), 
UNIQUE(name)
);

CREATE TABLE "aircrafts"(
"name" char( 6 ),
"creator" char( 5 ) NOT NULL,
"crew" int CHECK(crew> 0  AND crew< 40 ),
"speed" int CHECK(speed> 0 ),
"distance" int CHECK(distance> 0 ),
"ceiling" int CHECK(ceiling> 0 ),
"year" int CHECK(year> 1928  AND year< 2010 ),
"type" char( 5 ),
"engine" text DEFAULT 'unknown',
"engine_power" int CHECK(engine_power> 0 ),
"engine_num" int CHECK(engine_num> 0  AND engine_num< 10 ),
"all_up_weight" int CHECK(all_up_weight> 0 ),
"bomb_load" int CHECK(bomb_load> 0 ),
"span" numeric( 5 , 2 ) CHECK(span> 0 ), 
"length" numeric( 5 , 2 ) CHECK(length> 0 ),
"height" numeric( 5 , 2 ) CHECK(height> 0 ),

PRIMARY KEY(name), 
FOREIGN KEY(type) REFERENCES types_aircraft(id), 
FOREIGN KEY(creator) REFERENCES organizations_creator(id) 
);


CREATE TABLE "missiles"(
"aircraft" char( 6 ) NOT NULL,
"codename" char( 6 ) NOT NULL,
PRIMARY KEY(codename, aircraft) , 
FOREIGN KEY(codename) REFERENCES info_missiles(name), 
FOREIGN KEY(aircraft) REFERENCES aircrafts(name) 
);


CREATE TABLE "guns"(
"aircraft" char( 6 ) NOT NULL,
"codename" char( 6 ) NOT NULL,
PRIMARY KEY(codename, aircraft) , 
FOREIGN KEY(codename) REFERENCES info_guns(name), 
FOREIGN KEY(aircraft) REFERENCES aircrafts(name)
);
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35012634
Vladimir_Mi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот, зааттачил запросы заполнения базы... будет время если ... поглядите плиз, у вас опыта больше в этих вопросах.
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35012669
drev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
select name, crew
	from aircrafts
	where 
		 2 < (
				select count(*) from missiles where missiles.aircraft = aircrafts.name
			)
		and
		 2 < (
				select count(*) from guns where guns.aircraft = aircrafts.name
			)
		and crew =
			(
				select min(crew)
				from aircrafts
				where 
					 2 < (
							select count(*) from missiles where missiles.aircraft = aircrafts.name
						)
					and
					 2 < (
							select count(*) from guns where guns.aircraft = aircrafts.name
						)
			)
order by name


Что-то типа так:)

но по Вашим данных таких нет:(
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35012714
Vladimir_Mi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
drev , я у вас в долгу ... видать я ещё дальше от SQL чем думал. Такая ..гм... локоничная реализация запроса... простая и в то же время - работает! Теперь надо разобраться как оно работает и садиться за оформление курсовика.
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35012729
Kvant_hv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ех ты чтож за ящик выставил, регистрироватся пришлось ... ну лады вообщем не было сил да время проверять поскольку надо было подгонять твою базу данных вообщем проверь следующий код - должен быть верным.

select name, crew from
(select name, crew from aircrafts where name in
(select aircraft from missiles group by aircraft having 2 < count(*)
intersect
select aircraft from guns group by aircraft having 2 < count(*))
) tmpTBL
group by name, crew having crew = min(crew);
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35012759
Vladimir_Mi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо и вам большое Kvant_hv что попытались разобраться, была у меня тоже мысль использоваться временную таблицу, запрос вроде правильный... но почему-то не делат отбор по crew ... условие crew = min(crew) не работает ... если были бы в базе (безусловно моя вина что дал вам такую сырую базу... другой нету) варианты с самолетами имеющими более 2-х пушек и 2-х типов ракет + ещё с разным количеством экипажа... вы бы увидили, что выводятся все самолеты (проходящие по оружию) и не учитывается кол-во человек экипажа.

Для наглядности положим что надо иметь большег одного (а не двух) типов ракет и пушек, дополним базу
Код: plaintext
1.
INSERT INTO guns VALUES ('SU-34','NR-30');
INSERT INTO missiles VALUES ('SU-34','K-7');

запросу будут отвечать 3 самолета: Миг-23, Су-11 и Су-34 ... хотя Су-34 имеет в экипаже 2-х человек против 1-го человека у Миг-23 и Су-11 ... правильным (по сортировке crew = min(crew)) должен быть вывод только Миг-23 и Су-11. Меня это чуть сума не свело за 4 дня ... тоже не сортировал и все.... почему не работает понять до сих пор не могу...
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35012769
drev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir_MiСпасибо и вам большое Kvant_hv что попытались разобраться, была у меня тоже мысль использоваться временную таблицу, запрос вроде правильный... но почему-то не делат отбор по crew ... условие crew = min(crew) не работает ... если были бы в базе (безусловно моя вина что дал вам такую сырую базу... другой нету) варианты с самолетами имеющими более 2-х пушек и 2-х типов ракет + ещё с разным количеством экипажа... вы бы увидили, что выводятся все самолеты (проходящие по оружию) и не учитывается кол-во человек экипажа.

Для наглядности положим что надо иметь большег одного (а не двух) типов ракет и пушек, дополним базу
Код: plaintext
1.
INSERT INTO guns VALUES ('SU-34','NR-30');
INSERT INTO missiles VALUES ('SU-34','K-7');

запросу будут отвечать 3 самолета: Миг-23, Су-11 и Су-34 ... хотя Су-34 имеет в экипаже 2-х человек против 1-го человека у Миг-23 и Су-11 ... правильным (по сортировке crew = min(crew)) должен быть вывод только Миг-23 и Су-11. Меня это чуть сума не свело за 4 дня ... тоже не сортировал и все.... почему не работает понять до сих пор не могу...


Потому, что HAVING работает только на текущую группу. Считайте, что это WHERE, применённое к промежуточному сету (результату GROUP BY).
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35012774
Vladimir_Mi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
drevПотому, что HAVING работает только на текущую группу. Считайте, что это WHERE, применённое к промежуточному сету (результату GROUP BY).
Хм... поэтому походу не один из десятка моих "гениальных" запросов и не работал...
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35012786
drev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with tmp(name, crew) as
(
select name, crew
	from aircrafts
	where 
		 2 < (
				select count(*) from missiles where missiles.aircraft = aircrafts.name
			)
		and
		 2 < (
				select count(*) from guns where guns.aircraft = aircrafts.name
			)
)
select name, crew 
from tmp
where 
crew =
			(
				select min(crew)
				from tmp
			)
order by name


На SQL Server 2005 можно упростить исходный запрос. Как на Postgress - не знаю:(
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35012795
Vladimir_Mi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
drevНа SQL Server 2005 можно упростить исходный запрос. Как на Postgress - не знаю:(
Да... PSQL ругается... впрочем не смею больше отнимать ваше время... вы здоровски мне помогли. Спасибо.
...
Рейтинг: 0 / 0
Помогите составить запрос... 3-й днь сижу.
    #35013427
drev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir_Mi drevНа SQL Server 2005 можно упростить исходный запрос. Как на Postgress - не знаю:(
Да... PSQL ругается... впрочем не смею больше отнимать ваше время... вы здоровски мне помогли. Спасибо.

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


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