У меня есть два столбца: первый из них - лучшие 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 это немного сложно сделать, чтобы это сделать. Если вы работаете на SQL Server 2005 или новее, вы можете использовать CTE с CROSS JOIN
и некоторые трюки, чтобы получить результат, который вы ищете:
;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 (Common Table Expression) отображает продукты - это должно основываться на некотором столбце из таблицы Products
, но вы не указали, какой столбец определяет порядок.
Затем мы выбираем строки 1-10 из CTE, а также строки 11-20 из второго экземпляра CTE. Если вы оставите это как есть, вы получите 100 строк - каждая комбинация строк 1-10 из первого набора результатов по каждому из 10 строк из второго результирующего набора.
Для этого вам нужно дополнительное условие, основанное на номерах строк, для "объединения" одной строки из каждого набора результатов, и таким образом вы получите десять строк - первый столбец содержит элементы 1-10 из таблицы "Продукты", второй столбец имеет строки 11-20
Я не уверен, что это лучший способ сделать это, но он работает
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
declare @FromRange int
declare @ToRange int
set @FromRange =11
set @ToRange =20
SELECT top(@[email protected]+1) * FROM [tbl]
where tbl_id not in (select top (@FromRange-1) tbl_id from tbl)
ORDER BY tbl_id
SELECT * FROM Product LIMIT(10,10)
Попробуйте следующее:
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
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 top 20 * from [table Name]
except
select top 10 * from [table Name]
SELECT p.* FROM
(
SELECT *, ROW_NUMBER() OVER (ORDER BY /*some column*/) AS row_num
FROM Product
) AS p
WHERE p.row_num BETWEEN 11 AND 20
select *
from (select *
from <table>
order by id asc)
where rownum <= 20
minus
select *
from (select *
from <table>
order by id asc)
where rownum <= 10
Попробуйте следующее:
SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY ColumnName) AS MyRowNumber, *
FROM TableName) tbl
WHERE MyRowNumber BETWEEN 20 AND 30
Начиная с SQL Server 2012, порядок смещения/выборки:
SELECT *
FROM SomeTable
ORDER BY someIdField
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;