Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
greggy78
Member

Откуда:
Сообщений: 12
Здравствуйте всем! Да, банально, но необходимо сдать предмет на знание SQL
База стандартная, майкрософтовская Northwind или Adventure Works.
Нужно написать запрос "Найти покупателей, которые кроме прочих покупок, обязательно купили все товары, купленные когда-либо и кем-либо более 2 раз включительно."

Вот запрос:

select distinct CustomerID from Orders a join [Order Details] b on a.Orders=b.Orders
where (b.ProductId = ALL (select ProductID from [Order Details]
group by ProductID  
having count(*)>=2))

AND ( (b.ProductId = ALL (select ProductID from [Order Details]
group by ProductID  
having count(*)>=2)

OR

(b.ProductId NOT IN (select ProductID from [Order Details]
group by ProductID  
having count(*)>=2)) )


Да, выглядит ужасно... Помогите, является ли это решением?

P.S. Как конструировать запросы SELECT ? как бы допустим иное задание вроде "найти такого покупателя, который покупал товары из каждой категории минимум 2 штуки" и т.п.

Спасибо, не нашел раздела вроде Песочницы etc
31 май 13, 12:00    [14374757]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
greggy78, этот запрос писали вы или где-то представлен пример?
31 май 13, 12:03    [14374782]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
greggy78
Member

Откуда:
Сообщений: 12
Сергей Викт.,

Да, это я писал. В самой базе такого Customer'a нет
31 май 13, 12:07    [14374834]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
greggy78, ну так добавьте покупателей, которые кроме прочих покупок, обязательно купили все товары, купленные когда-либо и кем-либо более 2 раз включительно.
Я честно говоря в этом требовании не разобрался. Т.е. должен быть кто-то, кто купил все товары, которые до него кто-то покупал и ещё и более 2х раз.... олигарх какой-то
31 май 13, 12:10    [14374857]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
greggy78
"Найти покупателей, которые кроме прочих покупок, обязательно купили все товары, купленные когда-либо и кем-либо более 2 раз включительно."
Реляционное деление
31 май 13, 12:15    [14374907]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
greggy78
Member

Откуда:
Сообщений: 12
Сергей Викт.,

Вот в этом
автор
добавьте
и вопрос =)

Задание, на примере. - Есть группа товаров (из кучи) - эти товары уже покупали более 2 раз (они фигурируют в заказах). Нужно найти человека, который обязательно купил как раз всю эту группу товаров И в том числе какие-то товары, которые не в этой группе (куплены были всего 1 раз напр.)
31 май 13, 12:17    [14374917]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
greggy78
Сергей Викт.,

Да, это я писал. В самой базе такого Customer'a нет


а вы пытались этот запрос хотя бы раз запустить например в SSMS даже пока не прибегая к решению задачи?
Ну, посмотреть на сообщения, то-сё..
или вы планируете все осуществить теоретически?
31 май 13, 12:19    [14374936]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
greggy78
Member

Откуда:
Сообщений: 12
invm,

О, а вот это круто. Не знал.
31 май 13, 12:20    [14374943]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
greggy78
Member

Откуда:
Сообщений: 12
Winnipuh,

Естественно запускал, на тестовом компе. Сейчас написал по памяти, да, сейчас синтаксисом что-то.
Но он выдавал мне NULL
31 май 13, 12:24    [14374974]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
greggy78
Member

Откуда:
Сообщений: 12
greggy78,

В первой строке не Orders, а OrderID, sorry
31 май 13, 12:26    [14374995]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
greggy78
Member

Откуда:
Сообщений: 12
В любом случае, есть ли... методика разбора известная какая-нибудь? Может у меня мозг плохой, но на лету иной раз быстро не выходит решение.

И да, мой запрос является решением?
31 май 13, 12:29    [14375021]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
greggy78
есть ли... методика разбора известная какая-нибудь?

Да. Теория реляционных баз данных называется. Затем SQL - Structered Query Language.

А пособия вида "Возьмите Таблицу1 и соединиет ее с Таблица2" не существует
31 май 13, 12:33    [14375062]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
greggy78
Winnipuh,

Естественно запускал, на тестовом компе. Сейчас написал по памяти, да, сейчас синтаксисом что-то.
Но он выдавал мне NULL


важно, что ошибок сервер на такой запрос не выдавал?
31 май 13, 12:41    [14375124]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
greggy78
Member

Откуда:
Сообщений: 12
Winnipuh,
,
Нет, всё в порядке. В том что сверху написан ошибка в первой строке, нужно
select distinct CustomerID from Orders a  join [Order Details] b on a.OrderID=b.OrderID
- OrderID

Не могу отредактировать.
31 май 13, 12:46    [14375156]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
greggy78,

Запрос неправильный
31 май 13, 15:14    [14376325]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
Гость333
Member

Откуда:
Сообщений: 3683
greggy78
where (b.ProductId = ALL (select ProductID from [Order Details]

Предикат ALL бессмысленно использовать с оператором "равно". Если вложенный запрос "select ProductID from [Order Details]" вернёт несколько различных значений (Значение1, Значение2, ..., ЗначениеN), то ваше сравнение будет эквивалентно такому:
b.ProductId = Значение1 AND b.ProductId = Значение2 ... AND b.ProductId = ЗначениеN
Очевидно, что такое условие всегда будет false.
31 май 13, 15:34    [14376485]     Ответить | Цитировать Сообщить модератору
 Re: Студ.Вопрос: Как научиться конструировать SELECT или подскажите по данному запросу  [new]
aleks2
Guest
greggy78
P.S. Как конструировать запросы SELECT ? как бы допустим иное задание вроде "найти такого покупателя, который покупал товары из каждой категории минимум 2 штуки" и т.п.

Спасибо, не нашел раздела вроде Песочницы etc


Не надо пытаться написать "все сразу" - мелкие прыжки в нужном направлении гораздо продуктивнее. В версиях старше 2005 - CTE, раньше - временные таблицы

;with
--купленные когда-либо и кем-либо более 2 раз включительно."
goods2 as ( select ProductId from [Order Details] group by ProductId having count(*) > 2 )
-- можно проверить
--select * from goods2
-- и писать дальше

-- все покупатели с их товарами заказами
buyers_products as
  ( select a.CustomerID, b.ProductId from Orders a inner join [Order Details] b on a.Orders=b.Orders )

-- покупатели, которые купили ЧТО-ТО из товаров goods2
buyers_any2 as
  ( select distinct b.CustomerID from buyers_products bp inner join goods2 g on g.ProductId = bp.ProductId )
-- можно проверить
--select * from buyers_any2
-- и писать дальше

-- покупатели, которые купили ВСЕ товары goods2
buyers_all2 as
  ( select CustomerID from buyers_any2 b2 
     where  -- нет пропущенных товаров из списка goods2
               not exists ( select * from goods2 g 
                                                 left outer join (select * from buyers_products where CustomerID = b2.CustomerID ) bp
                                           where bp.CustomerID is null 
                             )
  )
-- и фсе
select * from buyers_all2;
1 июн 13, 09:08    [14378585]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить