我必须从三张不同的牌桌中找到最高价,但我不知道如何获得P的最大价格。
PC(模型,速度,RAM,HD,价格)
笔记本电脑(模型,速度,RAM,HD,屏幕,价格)
打印机(型号,颜色,型号,价格)
SELECT model
FROM ((SELECT MAX(price)
FROM PC)
UNION
(SELECT MAX(price)
FROM Laptop)
UNION
(SELECT MAX(price)
FROM Printer)) AS P
WHERE MAX(P);
我可以在前面添加MAX吗?像
SELECT model
FROM MAX((SELECT MAX(price)
FROM PC)
UNION
(SELECT MAX(price)
FROM Laptop)
UNION
(SELECT MAX(price)
FROM Printer));
答案 0 :(得分:2)
如果您需要该模型,请使用union all
和order by
。您没有指定数据库,因此这里是ANSI标准解决方案:
SELECT model, price
FROM ((SELECT model, price FROM PC)
UNION ALL
(SELECT model, price FROM Laptop)
UNION ALL
(SELECT model, price FROM printer)
) p
ORDER BY price desc
FETCH FIRST 1 ROW ONLY;
数据库中真正不同的唯一部分是FETCH FIRST 1 ROW ONLY
。这可能是limit
,top
或其他一些构造。
答案 1 :(得分:0)
如果您只想获得价格最高的1条记录,则应使用TOP 1
。这样的事情:
SELECT TOP 1 model
FROM ((SELECT MAX(price)
FROM PC)
UNION
(SELECT MAX(price)
FROM Laptop)
UNION
(SELECT MAX(price)
FROM Printer)) AS P
WHERE MAX(P)
ORDER BY P DESC;
答案 2 :(得分:0)
首先,您应该为每个表找到max(price)
。在这种情况下,查询将计算所有使用索引(假设您有一个价格)。
UPD:此外,您最好将表格标准化并将价格(以及其他常见字段)提取到单独的表格中。这将允许您使用此表进行价格操作并对您的实体进行处理,而无需关心其具体类型。
答案 3 :(得分:0)
注意:您还没有指定供应商,我会使用Oracle文档作为我的答案(但它可能是可移植的)。
您只需要最高价吗?那么子查询现在就足够了,但是你错误地使用了聚合函数:
SELECT
MAX(PRICE) AS HIGHEST_FROM_ALL_TABLES
FROM
(
SELECT MAX(PRICE) AS PRICE FROM PC
UNION
SELECT MAX(PRICE) AS PRICE FROM LAPTOP
UNION
SELECT MAX(PRICE) AS PRICE FROM PRINTER
)
但是,如果您还需要使用该模型,则需要稍微不同的方法。
SELECT
MAX(PRICE) KEEP(DENSE_RANK LAST ORDER BY PRICE) AS HIGHEST_PRICE,
MAX(MODEL) KEEP(DENSE_RANK LAST ORDER BY PRICE) AS THE_MODEL
FROM
(
SELECT PRICE, MODEL FROM PC
UNION ALL
SELECT PRICE, MODEL FROM LAPTOP
UNION ALL
SELECT PRICE, MODEL FROM PRINTER
)
在这里,我们:
答案 4 :(得分:0)
如果在子查询中使用MAX,则可以:
SELECT model FROM (
(SELECT model, price FROM PC)
union
(SELECT model, price FROM Laptop)
union
(SELECT model, price FROM Printer)
) as AllPrices
WHERE price = (
select max(val) from (
(SELECT max(price) as val FROM PC)
union
(SELECT max(price) as val FROM Laptop)
union
(SELECT max(price) as val FROM Printer)
) as MaxPrices
)
LIMIT 1
这个更大,但实际上比简单地选择整个表和排序更快,因为它为数据库引擎提供了更好的优化机会(它不需要对所有记录进行排序,只需要重要的记录)。在Postgresql上进行测试,它在一个非常大的数据库上运行了一半。