从三个不同的表中找到最高价格
Finding the highest price from three different tables
我必须从三个不同的表中找到最高价,但我现在不知道如何获得 P 的最大值。
PC(型号、速度、内存、高清、价格)
笔记本电脑(型号、速度、内存、高清、屏幕、价格)
打印机(型号、颜色、类型、价格)
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));
如果您只想获得最高价格的 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;
首先,你应该为每个table找到max(price)
。在这种情况下,查询将计算所有使用索引(前提是你有一个价格)。
UPD:此外,您最好规范化 tables 并提取价格(和其他公共字段)以分隔 table。这将允许您使用此 table 进行价格操纵并对待您的实体而不用关心它们的具体类型。
注意:您没有指定供应商,我将使用 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
)
在这里,我们:
- 将幸运的具有相同列布局的三个表联合起来。
- 使用LAST analytic function without a partition to get only one row in the end. (mssql translation: here)
结果是全球最高价和它的相关型号。如果您有多行具有相同的价格,它仍然 returns 只有一行,即订单经过的最后一行。
最好的方法是获取所需行的 ID,并将此分析选择作为子查询。然后获取唯一具有此 ID 的行。
如果您想要模型,请使用 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
或其他一些结构。
你可以,如果你在子查询中使用 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 上测试,它 运行 在一个非常大的数据库上只用了一半的时间。
我必须从三个不同的表中找到最高价,但我现在不知道如何获得 P 的最大值。
PC(型号、速度、内存、高清、价格)
笔记本电脑(型号、速度、内存、高清、屏幕、价格)
打印机(型号、颜色、类型、价格)
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));
如果您只想获得最高价格的 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;
首先,你应该为每个table找到max(price)
。在这种情况下,查询将计算所有使用索引(前提是你有一个价格)。
UPD:此外,您最好规范化 tables 并提取价格(和其他公共字段)以分隔 table。这将允许您使用此 table 进行价格操纵并对待您的实体而不用关心它们的具体类型。
注意:您没有指定供应商,我将使用 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
)
在这里,我们:
- 将幸运的具有相同列布局的三个表联合起来。
- 使用LAST analytic function without a partition to get only one row in the end. (mssql translation: here)
结果是全球最高价和它的相关型号。如果您有多行具有相同的价格,它仍然 returns 只有一行,即订单经过的最后一行。
最好的方法是获取所需行的 ID,并将此分析选择作为子查询。然后获取唯一具有此 ID 的行。
如果您想要模型,请使用 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
或其他一些结构。
你可以,如果你在子查询中使用 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 上测试,它 运行 在一个非常大的数据库上只用了一半的时间。