从三个不同的表中找到最高价格

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
  )

在这里,我们:

  1. 将幸运的具有相同列布局的三个表联合起来。
  2. 使用LAST analytic function without a partition to get only one row in the end. (mssql translation: here)

结果是全球最高价和它的相关型号。如果您有多行具有相同的价格,它仍然 returns 只有一行,即订单经过的最后一行。

最好的方法是获取所需行的 ID,并将此分析选择作为子查询。然后获取唯一具有此 ID 的行。

如果您想要模型,请使用 union allorder 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。这可能是 limittop 或其他一些结构。

你可以,如果你在子查询中使用 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 上测试,它 运行 在一个非常大的数据库上只用了一半的时间。