С Новым годом! Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 1
Регистрация: 06.03.2015
Сообщений: 87
1

Как написать SQL запрос

06.03.2015, 12:03. Показов 2228. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, решаю такую задачу по SQL.
У меня в базе есть таблицы: поставки SPJ (num_post,num_detal,num_izdel,kolvo), детали P (num_detal,name,color,massa,town), изделия J(num_izdel,name_izdel,town), поставщики S(num_postб,surname,rejting,gorod).

Задание такое:
Выбрать все пары поставщиков, поставляющие одинаковые детали для одного и того же изделия. Вывести номер изделия, номер детали, номер поставщика1, общий объем поставки данной детали для данного изделия поставщика1, номер поставщика2, общий объем поставки данной детали для данного изделия поставщика2, город изделия, город детали, город поставщика1 , город поставщика2.

Так как в задании просят выбрать разных поставщиков, то значит надо работать с таблицой поставки SPJ, поэтому я ввожу два псевдонима p1 и p2 для различения поставщиков. Во вложенных запросах я пытаюсь генерировать наборы деталей для заданного поставщика и заданного изделия и хочу их сравнить. Но вот тут возникли проблемы, SQL не дает сравнивать вложенные запросы, которые имеют не сколько ответов. Вот допустим первый вложенный запрос вернул {P1,P3} и второй тоже самое, а как их сравнить на совпадение ? Я решил взять разность множеств, если они равны, то результат будет Null, но такой запрос не выдает никакие ответы, но и ошибок на компиляции нет.

Подскажите, пожалуйста, где ошибка тут у меня.
У меня в таблицы поставки есть строки:
номер поставщика, номер детали номер, изделия количество
S2 J1 P3
S3 J1 P3
То есть запрос должен выдавать эту пару поставщиков, так как они для одной детали поставляют одни и те же изделия, но не выдает, помогите найти ошибку.

T-SQL
1
2
3
select distinct p1.num_izdel,p1.num_detal,p1.num_post,p2.num_post from SPJ p1,SPJ p2
 
where  not exists ((select a.num_detal from spj a where a.num_post=p1.num_post and a.num_izdel=p1.num_izdel) intersect (select a.num_detal from spj a where a.num_post=p1.num_post and a.num_izdel=p1.num_izdel) )
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Блог
06.03.2015, 12:03
Ответы с готовыми решениями:

Как написать запрос SQL?
Необходимо написать запрос результат которого ответит на вопрос: Сколько юзеров на каждом из...

Как написать SQL запрос
/*Написать SQL запрос, который выбирает ФИО всех студентов у которых не менее 2 пятерок, и...

Как можно написать запрос В SQL
Написать запрос к базе данных поставщиков и деталей, который находит все пары "номер...

Как написать запрос, чтобы рассчитать количество групп sql?
Тут такая ситуация, нужно как-то рассчитать количество групп Вот у меня сейчас запрос, я здесь...

4
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,271
06.03.2015, 14:03 2
Цитата Сообщение от roman912 Посмотреть сообщение
я пытаюсь генерировать наборы деталей для заданного поставщика и заданного изделия и хочу их сравнить
Они должны совпасть как по количеству строк, так и по значениям соответствующих полей?
Эта операция называется "реляционное деление", есть смысл погуглить и изучить.
Скорее всего лучший выбор - предикаты EXISTS()/NOT EXISTS()
0
1 / 1 / 1
Регистрация: 06.03.2015
Сообщений: 87
06.03.2015, 14:11  [ТС] 3
Цитата Сообщение от iap Посмотреть сообщение
Они должны совпасть как по количеству строк, так и по значениям соответствующих полей?
Да, то есть ответы {P1,P2,P3} и {P3,P1,P2} считаются одинаковыми.

Добавлено через 3 минуты
Цитата Сообщение от iap Посмотреть сообщение
Скорее всего лучший выбор - предикаты EXISTS()/NOT EXISTS()
Я и использую not exists(), я беру разность этих результатов, если они результат ведь null, поэтому использую not exists, но не получаю ответ.
0
3548 / 2122 / 752
Регистрация: 02.06.2013
Сообщений: 5,150
06.03.2015, 14:59 4
Цитата Сообщение от roman912 Посмотреть сообщение
Я и использую not exists()
not exists() сам по себе не есть реляционное деление.
0
1 / 1 / 1
Регистрация: 06.03.2015
Сообщений: 87
06.03.2015, 15:18  [ТС] 5
Цитата Сообщение от invm Посмотреть сообщение
not exists() сам по себе не есть реляционное деление.
Я пытаюсь брать разность этих двух множеств строк, если они равны по значениям элементов, то ведь получается пустое множество null, которое я и хочу проверить командой not exists(). Но почему-то не получается так.
0
06.03.2015, 15:18
cpp_developer
Эксперт
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Блог
06.03.2015, 15:18
Помогаю со студенческими работами здесь

Написать SQL запрос
Всем привет!!! Нужно написать один SQL запрос, но что то не получается :wall: Вот запрос: ...

Помогите написать SQL-Запрос
Даны таблицы: Объект objects(ID int, Name varchar(50), ID_type int) и тип объекта type(ID int,...

Не получается написать SQL запрос на выборку с вычислением
https://www.cyberforum.ru/attachment.php?attachmentid=947029&stc=1&d=1529050187 Нужно сделать...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru