Sql 如何在不使用“top”操作的情况下选择前2或前3个图书价格

Sql 如何在不使用“top”操作的情况下选择前2或前3个图书价格,sql,sql-server,db2,Sql,Sql Server,Db2,我有一个名为books的表,书名是book_,价格是我使用的SQL SERVER 2008 我需要买两本价格最高的书 我用过这个: Select * From bb n Where (Select Count(book) From bb Where book <> n.book And price > n.price ) >=2 // or 3 it must be flexible 但给了我不正确的

我有一个名为books的表,书名是book_,价格是我使用的SQL SERVER 2008 我需要买两本价格最高的书

我用过这个:

 Select * From bb n  Where (Select Count(book) From bb  
    Where   book <> n.book
      And
        price >  n.price
        ) >=2 // or 3  it must be flexible 
但给了我不正确的答案:

不允许使用“top”操作或order by或OLAP函数
只需简单的查询。

您可以使用排名函数而不是top

免责声明:我不鼓励任何人在任何实际情况下遵循本文中描述的技术。我追问这个问题只是因为它是理论上的挑战

我想这是一个理论/教科书/家庭作业问题,我想不出在现实生活中不使用order by的理由,但下面是:

SELECT * FROM bb
WHERE price = (SELECT MAX(price) FROM bb)
OR price = (SELECT MAX(price) FROM bb WHERE price < (SELECT MAX(price) FROM bb))
您甚至可以将其进一步压缩,但会丢失排名信息:

DECLARE @NumberOfRecords int
SET @NumberOfRecords = 3

SELECT * FROM bb WHERE @NumberOfRecords > (
        SELECT COUNT(*) + 1 FROM bb AS bb2
        WHERE bb2.price > bb.price
        OR (bb2.price = bb.price AND bb2.id < bb.id)
    )

真的。不要这样做。

不允许使用按价格描述的超额订购。请在开始之前阅读我的问题answering@Maria:为什么不允许按价格说明超额订购您标记了sql server see you问题我不知道该使用什么it@Maria你说不准是什么意思?这是家庭作业吗?课程材料是否没有提供任何洞察,说明在不使用禁止使用的方法的情况下,你应该如何解决这个问题,哪种方法恰好是最有效和最直观的方法?我需要灵活一些,有时我需要排名前3、4或5。认真地说,你有什么理由避免按顺序排列?奥詹·范·赫克,这可能是一个家庭作业问题。@Tony:是我从中学到了一些东西:D
;WITH ids AS
(
    SELECT id FROM bb
    WHERE price = (SELECT MAX(price) FROM bb)
    OR price = (SELECT MAX(price) FROM bb 
        WHERE price < (SELECT MAX(price) FROM bb))
)
SELECT * FROM bb
WHERE id = (SELECT MAX(id) FROM ids)
OR id = (SELECT MAX(id) FROM ids WHERE id < (SELECT MAX(id) FROM ids))
SELECT MAX(price) as price FROM bb
UNION
SELECT MAX(price) FROM bb WHERE price < (SELECT MAX(price) FROM bb)
DECLARE @NumberOfRecords int
SET @NumberOfRecords = 3

;WITH bb_extended AS
(
    SELECT
        (
            SELECT COUNT(*) + 1 FROM bb AS bb2
            WHERE bb2.price > bb.price
            OR (bb2.price = bb.price AND bb2.id < bb.id)
        ) AS rank,
        *
    FROM
        bb
)
SELECT * FROM bb_extended
WHERE rank <= @NumberOfRecords
DECLARE @NumberOfRecords int
SET @NumberOfRecords = 3

SELECT * FROM bb WHERE @NumberOfRecords > (
        SELECT COUNT(*) + 1 FROM bb AS bb2
        WHERE bb2.price > bb.price
        OR (bb2.price = bb.price AND bb2.id < bb.id)
    )