在SQL中使用Min函数的子查询

时间:2018-10-31 16:25:20

标签: sql subquery min

这是架构

  • 作者(aID,fName,姓氏)
  • 图书(isbn,标题,authorID,类型,pubYear,publisher,rrPrice,avgRating)
  • bookShop(商店编号,商店名称,街道,城市,县)
  • 订单(orderNo,sNo,oDate,salesRep)
  • orderDetails(oNo,bookISBN,数量)

这是查询:

SELECT 
    title, pubYear, quantity 
FROM 
    book 
INNER JOIN 
    orderDetails ON ISBN = bookisbn
WHERE 
    avgRating = (SELECT MIN(avgRating)
                 FROM orderDetails)

我正在尝试获得评分最低的书,但这会返回所有书

2 个答案:

答案 0 :(得分:0)

我认为您需要在下面的查询中进行查询,因为您的等级列在书本上,因此您可能需要在子查询中更改表名

SELECT title, pubYear, quantity 
FROM book INNER JOIN orderDetails ON ISBN=bookisbn
WHERE avgRating=(SELECT min(avgRating)
                    FROM book )

答案 1 :(得分:0)

我想您可能想要:

SELECT b.title, b.pubYear
FROM book b
WHERE b.avgRating = (SELECT min(b2.avgRating)
                     FROM book b2
                    );

两件事。我删除了数量。我想您想对此进行总结,但您的问题未指定,并且每个订单的单独行似乎很奇怪。其次,我添加了表别名和限定的列名。那很重要。

您认为您的查询是:

SELECT b.title, b.pubYear, od.quantity 
FROM book b INNER JOIN 
     orderDetails od
     ON b.ISBN = od.bookisbn
WHERE b.avgRating = (SELECT MIN(od2.avgRating)
                     FROM orderDetails od2
                    )

但是avgRating中没有orderDetails列,因此WHERE子句实际上是:

WHERE b.avgRating = (SELECT MIN(b.avgRating)
                     FROM orderDetails od2
                    )

好吧,您正在将一列与其外部引用进行比较-难怪它总是正确的。

故事的寓意:始终限定表名,最好使用有意义的表别名,这些别名是表名的缩写。