SQL查询:选择子选择的最大值

约翰尼90

我有一个已经可以运行的sql语句,但是我认为必须有比我更好的解决方案。

我试图获得物品最高价格已经从未售出

通过此选择,我可以获得尚未售出的所有商品(数量+价格):

select anr, price
from article a 
where not exists(
    select 1 from OrderItems o
    where o.artnr = a.anr 
  )

商品编号+价格结果看起来像

| Anr | Price |
| 1   | 300.0 |
| 4   | 340.0 |
| 5   | 340.0 |
| 3   | 200.0 |

我以最高价格获得商品的临时解决方案是:

select anr, price 
from article 
where anr in(
  select anr
  from article a 
  where not exists(
    select 1 from OrderItems o
    where o.artnr = a.anr 
  )
)
and price = (
  select max(price)
  from article a 
  where not exists(
    select 1 from OrderItems o
    where o.artnr = a.anr 
  )
)

正确的解决方案是:

| Anr | Price |
| 4   | 340.0 |
| 5   | 340.0 |

有没有办法避免两次相同的子选择?

为了进行测试,这里是带有我的插入值的缩短的“创建表”脚本:

CREATE TABLE Article
(
  Anr Int Primary Key,
  Price Numeric(9,2) Not Null
);

CREATE TABLE Orders
(
  OrderNr Int Primary Key
)

CREATE TABLE OrderItems
(
  OrderNr Int References Orders On Delete Cascade, 
  ItemNr  Int,
  Artnr   Int References Article Not Null,
  Amount  Int Not Null Check(Amount >= 0),
  Primary Key(OrderNr, ItemNr)
)

-- articles without an order
Insert into Article (Anr, Price) values(1,300.0);
Insert into Article (Anr, Price) values(4,340.0);
Insert into Article (Anr, Price) values(5,340.0);
Insert into Article (Anr, Price) values(3,200.0);

-- articles for order with orderNr '1'
Insert into Article (Anr, Price) values(2,340.0);
Insert into Article (Anr, Price) values(6,620.0);

-- insert test order that contains the two articles
Insert into Orders (OrderNr) values (1);
Insert into OrderItems(OrderNr, ItemNr, Artnr, Amount) values(1,1,2,4);
Insert into OrderItems(OrderNr, ItemNr, Artnr, Amount) values(1,2,6,2);

我还阅读了主题子查询SQL中的“选择最大值”,但我认为在这种情况下,必须有一种更短的选择方法。

蒂姆·比格莱森(Tim Biegeleisen)

这是一个避免使用您拥有的相关子查询之一的解决方案,而是将其替换为LEFT JOIN

SELECT a.*
FROM article a LEFT JOIN OrderItems o ON a.anr = o.artnr
WHERE o.artnr IS NULL AND
    a.price = (SELECT MAX(a.price)
               FROM article a LEFT JOIN OrderItems o ON a.anr = o.artnr
               WHERE o.artnr IS NULL)

此解决方案应符合ANSI-92,这意味着它应与MySQL,Oracle,SQL Server以及您可能遇到的任何其他类型的快餐友好兼容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MySQL选择最大值而不使用子查询

来自分类Dev

SQL选择最大值

来自分类Dev

选择所有最大值SQL查询

来自分类Dev

选择的最大值

来自分类Dev

SQL选择最大值(COUNT)

来自分类Dev

从SQL选择中返回最大值

来自分类Dev

如何选择SQL输出的最大值

来自分类Dev

从列SQL中选择最大值

来自分类Dev

选择列的SQL最大值

来自分类Dev

使用 subQuery SQL 选择最大值

来自分类Dev

在一个SQL查询中选择最大值和最小值

来自分类Dev

SQL查询以选择每组最大值的每一行

来自分类Dev

用于选择最近的重复项和最大值的 SQL 查询

来自分类Dev

在查询中选择最大值作为类型

来自分类Dev

选择多个最大值

来自分类Dev

选择列的最大值

来自分类Dev

选择单个最大值

来自分类Dev

仅选择SQL关系中的最大值?

来自分类Dev

SQL-选择一行中的最大值

来自分类Dev

Oracle SQL:如何从派生列中选择最大值

来自分类Dev

SQL选择最大值4个联接

来自分类Dev

SQL选择从结果最大值中获取的位置

来自分类Dev

根据列 SQL Server 中的最大值选择行

来自分类Dev

SQL“选择最大”查询

来自分类Dev

SQL选择基于来自子查询的值

来自分类Dev

在单个查询中从SQL的同一列中选择最大值和最小值

来自分类Dev

选择最大值时如何选择最大日期值

来自分类Dev

选择最大值而不使用最大值?

来自分类Dev

分组时选择最大值的记录