Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2012, 01:16   #1
Metalor
 
Регистрация: 14.05.2012
Сообщений: 3
Смущение Написание SQL-запроса (level beginner)

Здравствуйте, форумчане, только начинаю изучать SQL и столкнулся с проблемой.
Есть 2 таблицы - таблица препаратов (drug), содержащая поле "наименование препарата" (NAME)
и таблица поставщиков (distributor), содержащая поля "имя поставщика" (DIST_NAME) и "наименование препарата" (DRUG_NAME), который поставляется этим поставщиком (масло масляное)
Никак не получается напиcать запрос, который бы выводил
Поставщиков, которые никогда не поставляли конкретный препарат.
Т.е. допустим содержимое таблиц такое:


drug

*****|
NAME-|
-------|
aaaa--|
bbbb--|
cccc--|
*****|



distributor

|*********************|
|DIST_NAME--|DRUG_NAME--|
|---------------------------|
|-1-----------|-aaaa-------|
|-1-----------|-bbbb-------|
|-1-----------|-cccc-------|
|-2-----------|-bbbb-------|
|-2-----------|-cccc-------|
|-3-----------|-aaaa-------|
|*********************|

Поставщик 1 пославлял все имеющиеся в базе препараты, следовательно его выводить не нужно, поставщик 2 не поставлял препарат аааа, значит выводим его с соответствующим препаратом и
поставщик 3 не поставлял препараты cccc и bbbb, тоже выводим.
И на выходе должна быть такая таблица

|******************|
|-2-----------|-aaaa---|
|-3-----------|-bbbb---|
|-3-----------|-cccc---|
|******************|

Подскажите, пожалуйста, как написать запрос?
Metalor вне форума Ответить с цитированием
Старый 14.05.2012, 09:55   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1-х, структура БД у вас не очень правильная (она не нормализована!)

2-х, запрос жуткий. Если в таблице лекарств будет большое количество записей, а поставщики поставляют одно-два-три лекарства, то количество записей в выборке будет фактически порядка КоличествоПрепаратов*КоличествоПост авщиков

да и смысл НЕ очень понятен.

ну, попробуйте такой запрос:
Код:
select distributor.Dist_Name,  drug.Name 
 from distributor, drug
  where drug.Name not in (select dd.Drug_Name from distributor dd
                                    where dd.Dist_Name = distributor.Dist_Name)
order by distributor.Dist_Name,  drug.Name

За правильность запроса я НЕ ПОРУЧУСЬ! да и ресурсов (если он вообще работает) он должен "жрать" просто немерянно!

Последний раз редактировалось Serge_Bliznykov; 14.05.2012 в 10:36.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.05.2012, 10:01   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
dd..Dist_Name
С одной точкой...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.05.2012, 10:37   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Stilet
С одной точкой...
поправил. спасибо. копи-пасте подвёл
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.05.2012, 11:31   #5
Metalor
 
Регистрация: 14.05.2012
Сообщений: 3
По умолчанию

На самом деле это только кусок базы, я выдрал именно тот, с которым (думал) нужно непосредственно работать.
Нижу прикрепил всю структуру.
Serge_Bliznykov, я пробовал так писать, запрос выдаёт каждого поставщика с каждым лекарством (вообще с каждым) в 3-х экземплярах.
Вот таблицы (пример и внизу прикреплённый результут запроса):

---------------distributor_provides_drug---------------------------|-------------------drug---------------------
Изображения
Тип файла: jpg Вся база.JPG (81.7 Кб, 146 просмотров)
Тип файла: jpg distributor_provides_drug.jpg (58.4 Кб, 65 просмотров)
Тип файла: jpg drug.jpg (25.3 Кб, 69 просмотров)
Тип файла: jpg Запрос.jpg (88.0 Кб, 142 просмотров)
Metalor вне форума Ответить с цитированием
Старый 14.05.2012, 12:33   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно еще так попытаться, не факт, что прокатит При больших объемах информации очеь плохой запрос, да и результат тоже, согласен с Сергеем
Код:
SELECT U1.Dist_Name,drug.Name
  FROM drug,(SELECT Dist_Name FROM distributor GROUP BY Dist_Name) U1 
  WHERE NOT EXISTS(SELECT * FROM distributor WHERE distributor.Dist_Name=U1.Dist_Name AND distributor.DRUG_NAME=drug.Name)
  ORDER BY U1.Dist_Name,drug.Name
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.05.2012, 19:09   #7
Metalor
 
Регистрация: 14.05.2012
Сообщений: 3
По умолчанию

Аватар, спасибо вам большое, прокатило!
U1 - это вы некую таблицу ввели промежуточную?
Где можно конкретно об этом почитать и что загуглить?
Metalor вне форума Ответить с цитированием
Старый 14.05.2012, 19:18   #8
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
Где можно конкретно об этом почитать
На заборе у соседа, где же еще?
=master= вне форума Ответить с цитированием
Старый 14.05.2012, 19:37   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

На заборе написали - U1 это псевдоним вложенного запроса А почитать MSDN по SQL, гуглить-гуглить, можно и на русском нагуглить многое
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
оптимизация sql-запроса Vetra SQL, базы данных 0 20.07.2011 13:36
AdoQuery, подскажите правильное написание запроса salima БД в Delphi 1 11.12.2009 16:42
Удаление строки с помощью SQL запроса (Query1.SQL.ADD('Delete....')) Schutze Помощь студентам 6 29.11.2009 22:15
Написание SQL-запросов tsergey Помощь студентам 9 12.02.2009 11:17