我有两列数据,第一列我想要显示前10个产品(1-10)
就是这样
SELECT TOP 10 * FROM Product
我希望在第二列显示接下来的10个结果(11-20)。
如何做到?
我有两列数据,第一列我想要显示前10个产品(1-10)
就是这样
SELECT TOP 10 * FROM Product
我希望在第二列显示接下来的10个结果(11-20)。
如何做到?
WITH T AS
(
SELECT TOP 20 name,
row_number() OVER (ORDER BY id) AS RN
FROM Products
ORDER BY id
)
SELECT
MAX(CASE WHEN RN <=10 THEN name END) AS Col1,
MAX(CASE WHEN RN > 10 THEN name END) AS Col2
FROM T
GROUP BY RN % 10
我会这样做:
SELECT [columns] FROM [table names] ORDER BY [column name] DESC LIMIT 10 OFFSET 10;
这更为简单且不那么复杂....
你们觉得呢?
select top 10 wwwhid from wwwh where wwwhid not in(select top 10 wwwhid from wwwh)
从SQL Server 2012开始,引入了ORDER BY OFFSET/FETCH功能:
SELECT *
FROM SomeTable
ORDER BY someIdField
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
在SQL Server中,要完成这个任务有点棘手。如果你使用的是SQL Server 2005或更高版本,可以使用一个CTE和一些巧妙的技巧来实现所需的结果:
;WITH TopProducts AS
(
SELECT
ProductID, ProductName,
ROW_NUMBER() OVER(ORDER BY --some-column-here-- DESC) 'RN'
FROM dbo.Products
)
SELECT
p1.ProductID, p1.ProductName,
p2.ProductID, p2.ProductName
FROM
TopProducts p1
CROSS JOIN
TopProducts p2
WHERE
p1.RN BETWEEN 1 AND 10 -- get rows 1-10 from the first CTE
-- AND p2.RN BETWEEN 11 AND 20 redundant, as niktrs pointed out
AND p1.RN + 10 = p2.RN -- join rows from P1 and P2 so you don't get a cartesian product
CTE(公共表达式)对产品进行编号 - 这需要基于您的Products
表中的某些列,但您没有提及哪个列定义了顺序。
然后,我们从CTE中选择第1-10行,以及从第二个CTE的第11-20行。如果您将其保留不变,您将获得100行 - 第一个结果集的1-10行与第二个结果集的每个10行的组合。
这就是为什么您需要基于行号的附加条件来“连接”每个结果集中的一行,因此您将获得十行 - 第一列具有来自Products表的项目1-10,第二列具有第11-20行。
p1.RN = p2.RN - 10
作为JOIN条件 - 这也可以工作。 - marc_s我不确定这是最好的方法,但它可以运作。
select *
from
(
SELECT top 10 ROW_NUMBER() OVER(ORDER BY product) linenum, product
FROM products
) t1
JOIN
(
SELECT top 20 ROW_NUMBER() OVER(ORDER BY product) linenum, product
FROM products
) t2 ON t1.linenum+10 = t2.linenum
INNER JOIN
而不是FULL JOIN
?或者我有什么遗漏吗? - Andriy Mdeclare @FromRange int
declare @ToRange int
set @FromRange =11
set @ToRange =20
SELECT top(@ToRange-@FromRange+1) * FROM [tbl]
where tbl_id not in (select top (@FromRange-1) tbl_id from tbl)
ORDER BY tbl_id
WITH result_set AS
(SELECT ROW_NUMBER() OVER
(ORDER BY Product.ID DESC) AS
[row_number], Product.intId AS id, Product.Title As Title
FROM Product WHERE Product.Price > 11)
SELECT * FROM result_set WHERE [row_number] BETWEEN 10 AND 19
SELECT * FROM Product LIMIT(10,10)
LIMIT
关键字。 - Martin SmithLIMIT
关键字,这是 MySQL 的自定义特性,不是任何标准。 - marc_s试试这个:
SELECT *
FROM
(
SELECT TOP 10 ROW_NUMBER() OVER(ORDER BY ColName) RowNo, ColName
FROM TableName
) table1
INNER JOIN
(
SELECT TOP 20 ROW_NUMBER() OVER(ORDER BY ColName) RowNo, ColName
FROM TableName
) table2 ON table1.RowNo + 10 = table2.RowNo
SELECT * FROM Table ORDER BY Something OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
,这非常棒 :) - Alex Bagnolini