Упражнение 16 (подсказки и решения)
Упражнение 16 (подсказки и решения)
Избыточность решения 1.12.2 можно устранить, если вообще убрать подзапрос, а соединение выполнить между таблицами P и L. При этом запрос получится не только компактным, но и легко читаемым и, что не менее важно, более эффективным.
Еще один пример тяжело читаемого запроса, который был бы правильным, будь номер модели (model) числовым.
SELECT MAX(model1), MIN(model2), MAX(speed), MAX(ram)
FROM (SELECT pc1.model AS model1, pc2.model AS model2, pc1.speed, pc2.ram,
CASE WHEN CAST(pc1.model AS NUMERIC(6,2)) > CAST(pc2.model AS NUMERIC(6,2))
THEN pc1.model+pc2.model
ELSE pc2.model+pc1.model
END AS sm
FROM PC pc1, PC pc2
WHERE pc1.speed = pc2.speed
AND pc1.ram = pc2.ram
AND pc1.model <> pc2.model
) a
GROUP BY a.sm;
mssql
🚫
[[ error ]]
[[ column ]] |
---|
[[ value ]] |
Однако тип данных VARCHAR(50) подразумевает наличие произвольных символов, которое, наличие, имеет место в проверочной базе данных (скажем, T-64). На этих данных преобразование типа
CAST(pc1.model AS NUMERIC(6,2))
будет вызывать ошибку.
Я считаю, что это хороший пример того, как не следует писать запросы. Как же следует их писать? Загляните на форум задачи, когда её решите, там вы найдете лучшие образцы.