Sql 如何在不使用“top”操作的情况下选择前2或前3个图书价格
我有一个名为books的表,书名是book_,价格是我使用的SQL SERVER 2008 我需要买两本价格最高的书 我用过这个: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 但给了我不正确的
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)
)