Миксфорум

Миксфорум (http://mixforum.su/index.php)
-   Разговоры (http://mixforum.su/forumdisplay.php?f=11)
-   -   SQL (http://mixforum.su/showthread.php?t=11050)

dar 25.04.2012 15:06

SQL
 
Товарищи, тут такая штука, может кто отлично шарит в sql..
вот задача и ответ..вопрос следующий, что это за буква а в конце, без нее ничего не работае..в нете шарила, так и не нашла ответа..

Текст задания:
Найдите среднюю цену ПК и ПК-блокнотов, выпущенных производителем A (латинская буква).
Вывести: одна общая средняя цена.

Решение:

SELECT AVG(price)
FROM (
SELECT code, price, pc.model, ram, hd
FROM pc
WHERE model IN (
SELECT model
FROM product
WHERE maker='a'
)
UNION
SELECT code, price, laptop.model, ram, hd
FROM laptop
WHERE model IN (
SELECT model
FROM product
WHERE maker='a'
)
) a;

Joyst 25.04.2012 15:26

Цитата:

Сообщение от dar (Сообщение 569388)
Текст задания:
Найдите среднюю цену ПК и ПК-блокнотов, выпущенных производителем A (латинская буква).
Вывести: одна общая средняя цена.

Решение:

SELECT AVG(price)
FROM (
SELECT code, price, pc.model, ram, hd
FROM pc
WHERE model IN (
SELECT model
FROM product
WHERE maker='a'
)
UNION
SELECT code, price, laptop.model, ram, hd
FROM laptop
WHERE model IN (
SELECT model
FROM product
WHERE maker='a'
)
) a;

Так тоже будет работать:

Цитата:

SELECT sum(s.price)/sum(s.kol) as sredn FROM
(SELECT price,1 as kol FROM pc,product
WHERE pc.model=product.model AND product.maker='A'
UNION all
SELECT price,1 as kol FROM laptop,product
WHERE laptop.model=product.model AND product.maker='A') as s
:old7

Трактор 25.04.2012 15:28

Не претендую на звание знатока. Насколько я знаю sql последняя a это псевдоним таблицы. Перед ней можно написать as

SELECT AVG(price)
FROM (
SELECT code, price, pc.model, ram, hd
FROM pc
WHERE model IN (
SELECT model
FROM product
WHERE maker='a'
)
UNION
SELECT code, price, laptop.model, ram, hd
FROM laptop
WHERE model IN (
SELECT model
FROM product
WHERE maker='a'
)
) as a

dar 25.04.2012 15:29

Joyst, это я уже видела, у меня другой вопрос..

dar 25.04.2012 15:30

Трактор, какое имя, откуда оно взялось это имя?? это имя нигде не объявлялось..любую букву поставить вместо а и оно тоже работает

Трактор 25.04.2012 15:36

Цитата:

Сообщение от dar (Сообщение 569397)
какое имя, откуда оно взялось это имя?

Это псевдоним, который ты придумываешь сама. Ты можешь одну и туже таблицу задействовать в запросе несколько раз. При этом чтобы различать различные обращения к таблице ты даёшь им псевдонимы (в англоязычной документации alias).

SELECT model
FROM product as productA
inner join product as productB
on productA.producer = productB.trader

dar 25.04.2012 15:48

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

Трактор 25.04.2012 16:04

Если писать строго по SQL92 и выкинуть неиспользуемые поля, то запрос будет выглядеть так
Цитата:

SELECT AVG(a.price)
FROM (
SELECT pc.price as price
FROM pc as pc
WHERE pc.model IN (
SELECT product.model
FROM product as product
WHERE product.maker='a'
)
UNION ALL
SELECT laptop.price
FROM laptop as laptop
WHERE laptop.model IN (
SELECT product.model
FROM product as product
WHERE product.maker='a'
)
) as a
По результату запроса ты не можешь судить о том откуда взята цена из первого или второго подзапроса. Только если исполнишь его отдельно
Цитата:

SELECT code, price, laptop.model, ram, hd
FROM laptop
WHERE model IN (
SELECT model
FROM product
WHERE maker='a'
)
Вполне логично что второй запрос в объединении что-то возвращает. Почему бы в таблице laptop и не быть продуктам, производителя "a"?

И ещё. Обрати внимание на UNION ALL. Почитай чем отличается UNION от UNION ALL . Может быть в задании имеется в виду именно это различие?

dar 25.04.2012 16:38

Цитата:

Сообщение от Трактор (Сообщение 569411)
Только если исполнишь его отдельно

отдельно делаю

dar 25.04.2012 16:44

Цитата:

Сообщение от Трактор (Сообщение 569411)
UNION ALL
SELECT laptop.price as price
FROM laptop as laptop
WHERE laptop.model IN (
SELECT product.model
FROM product as product
WHERE product.maker='a'
)
) as a

а as ненадо ?


Часовой пояс GMT +3, время: 13:04.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot

Время генерации страницы 0.04319 секунды с 12 запросами