Перейти к содержимому

Фотография

Задача по SQL


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 8

#1 TeMbl4

TeMbl4

    Новый участник

  • Members
  • Pip
  • 5 сообщений
  • ФИО:Васильев Артем
  • Город:Киев

Отправлено 17 июля 2014 - 09:13

Всем привет!

Решая задачи по SQL наткнулся на одну непонятку. Решаю задачи с сайта http://sql-ex.ru/ и уперся в 28ю. Пробовал решить в разных сторон но ничего не выходило. Потом плюнул и нашел решение, чтобы понять что я не так делал. 

Приводить задачу не буду, так как проще с сайта посмотреть вместе со схемой базы.

 

Вот найденное правильное решение: 

 

select sum(pc.hd) / count(*)
from product, pc
where product.type = 'PC'
and product.model = pc.model
and exists(select 'x' from product p
where p.maker = product.maker
and p.type = 'Printer')

 

В решении все было понятно, кроме того, что выбирает оператор SELECT в подзапросе (пометил красным). Подскажите что значит 'x' в операторе SELECТ? 

 

За ответы буду очень благодарен, потому как башка кипит уже =) 

 

  • 0

#2 Freiman

Freiman

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 591 сообщений
  • ФИО:Андрей Адеркин
  • Город:Йошкар-Ола

Отправлено 17 июля 2014 - 10:31

http://stackoverflow...hat-is-select-x


  • 0

#3 ShortLegged

ShortLegged

    Постоянный участник

  • Members
  • PipPipPip
  • 155 сообщений
  • Город:Moscow

Отправлено 17 июля 2014 - 10:31

Как-то очень сложно получилось. Кажется так проще:
SELECT AVG(hd) FROM PC WHERE model IN (
SELECT model FROM Product P WHERE P.maker IN (SELECT maker FROM Product WHERE type = 'Printer') AND P.type = 'PC')

Насколько я понимаю, 'x' в SELECT означает 'x'  :yes: . Просто в случае если компания производит еще и принтеры он будет присутствовать, в противном случае будет пустое множество.


  • 1

#4 TeMbl4

TeMbl4

    Новый участник

  • Members
  • Pip
  • 5 сообщений
  • ФИО:Васильев Артем
  • Город:Киев

Отправлено 17 июля 2014 - 11:59

Спасибо за быстрые ответы!

 

Правильно ли я понял, что 'x' является своего рода индикатором? И в зависимости выполнения условия в EXISTS будет или не будет выводить данные?


  • 0

#5 clipsa

clipsa

    Специалист

  • Members
  • PipPipPipPipPip
  • 527 сообщений
  • ФИО:Ермолаева Ольга
  • Город:Москва


Отправлено 18 июля 2014 - 07:53

Да, вы поняли правильно. Вместо х может быть любое текстовое значение. Думаю выбрали именно х потому что он похож на крестик :)


  • 0

Не следует заставлять тестировщиков тестировать быстрее. Что может быть хуже испуганных, усталых, цинично настроенных тестировщиков?
-----------------
Хорошо, когда человек заводит баги. Плохо, когда баги заводят человека (с)
-----------------
Проект для начинающих тестировщиков Хомячки


#6 TeMbl4

TeMbl4

    Новый участник

  • Members
  • Pip
  • 5 сообщений
  • ФИО:Васильев Артем
  • Город:Киев

Отправлено 18 июля 2014 - 08:49

Фух, разобрался) Спасибо Ольга!

 

 

 Думаю выбрали именно х потому что он похож на крестик :)

 Скорее всего. В решении этого юзера постоянно этот подход применяется с иксом.


  • 0

#7 BadMF

BadMF

    Специалист

  • Members
  • PipPipPipPipPip
  • 809 сообщений
  • ФИО:Dmitry Petrov

Отправлено 22 июля 2014 - 13:33

select AVG(PC.hd) as hd from PC JOIN
Product ON PC.model = Product.model and Product.maker IN
(SELECT DISTINCT maker
FROM Product AS PC_product
WHERE type = 'PC' AND 
 EXISTS (SELECT maker
 FROM Product
 WHERE type = 'printer' AND 
 maker = PC_product.maker
 ))

Я так решил в своё время. 


  • 0

#8 TeMbl4

TeMbl4

    Новый участник

  • Members
  • Pip
  • 5 сообщений
  • ФИО:Васильев Артем
  • Город:Киев

Отправлено 22 июля 2014 - 18:58

Спасибо за свой вариант Дмитрий! Мне как начинающему очень интересно посмотреть разные варианты решения.


  • 0

#9 BadMF

BadMF

    Специалист

  • Members
  • PipPipPipPipPip
  • 809 сообщений
  • ФИО:Dmitry Petrov

Отправлено 23 июля 2014 - 14:43

так вы если задачу решили, можите зайти на форум и посмотреть все варианты решения которые возможны, там народ отписывается. Моё решение не самое быстрое.


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных