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

时间:2015-03-06 13:15:17

标签: sql max

我必须从三张不同的牌桌中找到最高价,但我不知道如何获得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));

5 个答案:

答案 0 :(得分:2)

如果您需要该模型,请使用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或其他一些构造。

答案 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
  )

在这里,我们:

  1. 将幸运地具有相同列布局的三个表联合起来。
  2. 使用不带分区的LAST分析函数最终只能获得一行。 (mssql翻译:here
  3. 结果是全球最高价格及其相关模型。如果您有多个具有相同价格的行,它仍然只返回一个,即订单遍历的最后一行。

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

答案 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上进行测试,它在一个非常大的数据库上运行了一半。