Jump to content
vpess

COMO USAR LIMIT NO SQL SERVER

Recommended Posts

vpess

Boa tarde,

Tenho a seguinte querie, mas esta com um problema, não consigo usar o limit.

Já estive a pesquisar e só fala na função top, mas como se trata de um sistema de paginação nao serve.

SELECT ItemNames.ItemID as ref, ItemNames.Description as design, ItemSellingPrices.UnitPrice as preco, Stock.Availableqty as stock, Item.FamilyID as familia
FROM Item
INNER JOIN ItemNames 
ON Item.ItemID=ItemNames.ItemID 
INNER JOIN Stock 
ON ItemNames.ItemID=Stock.ItemID 
INNER JOIN ItemSellingPrices
ON ItemNames.ItemID=ItemSellingPrices.ItemID  
INNER JOIN Family
ON Item.FamilyID=Family.FamilyID  
where Stock.WarehouseID=3 and ItemSellingPrices.PricelineID=1
LIMIT 0,100

Obrigado,

Cumps.

Share this post


Link to post
Share on other sites
M6

vpess, o SQL Server não tem LIMIT, isso não é sequer SQL standard.

Tem, como disseste, o TOP.

Se queres apenas determinados registos, podes usar algo como isto: http://blogs.msdn.com/b/sqlserver/archive/2006/10/25/limit-in-sql-server.aspx

No entanto, o TOP, ao contrário do que referes, serve perfeitamente para um sistema de paginação. Obtens os TOP X registos e descartar os que não te interessam no código. Por exemplo, tens uma paginação com 10 elementos por páginas e estás na página 2, onde mostras do 21 ao 30, fazer TOP 30 e descartas do 1 ao 20.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
vpess

Mas isso nao vai tornar a pesquisa muito mais lenta??

Sinceramente nao estou a ver como usar o top na minha querie

Share this post


Link to post
Share on other sites
Rechousa

Mas isso nao vai tornar a pesquisa muito mais lenta??

A resposta é não. Pode até ficar um pouco mais lenta a pesquisa, mas como transferes menos dados... Ganhas de um lado, perdes do outro.

Sinceramente nao estou a ver como usar o top na minha querie

Fazes como o M6 te disse e muito bem, pois é a melhor forma de fazer o que pretendes.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
vpess

Isto nao deveria funcionar?

SELECT ItemNames.ItemID as ref, ItemNames.Description as design, ItemSellingPrices.UnitPrice as preco, Stock.Availableqty as stock, Item.FamilyID as familia
FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases ) a, Item
INNER JOIN ItemNames 
ON Item.ItemID=ItemNames.ItemID 
INNER JOIN Stock 
ON ItemNames.ItemID=Stock.ItemID 
INNER JOIN ItemSellingPrices
ON ItemNames.ItemID=ItemSellingPrices.ItemID  
INNER JOIN Family
ON Item.FamilyID=Family.FamilyID  
where Stock.WarehouseID=3 and ItemSellingPrices.PricelineID=1 and ItemNames.ItemID and row > 1 and row <= 2

MAs é melhor esta forma ou a do top???

Share this post


Link to post
Share on other sites
M6

Só analisando a performance de uma e outra query é que se consegue saber qual é a melhor forma.

Esta segunda opção tem uma complexidade superior, pelo que diria que poderá ser mais lenta, mas sem analisar ambas é impossível de saber.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
Rechousa

Deve ser mais ou menos isto (não testei):

;WITH TabelaTemporaria AS
(
SELECT ItemNames.ItemID AS ref, ItemNames.Description AS design, ItemSellingPrices.UnitPrice AS preco, Stock.Availableqty AS stock, Item.FamilyID AS familia, ROW_NUMBER() OVER (ORDER BY ItemNames.ItemID) AS Row
FROM Item
INNER JOIN ItemNames ON Item.ItemID=ItemNames.ItemID 
INNER JOIN Stock ON ItemNames.ItemID=Stock.ItemID 
INNER JOIN ItemSellingPrices ON ItemNames.ItemID=ItemSellingPrices.ItemID  
INNER JOIN Family ON Item.FamilyID=Family.FamilyID  
WHERE Stock.WarehouseID=3 AND ItemSellingPrices.PricelineID=1 AND ItemNames.ItemID
)
SELECT * FROM TabelaTemporaria WHERE Row>5 and Row<10


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
vpess

É isso tudo obrigado.

Deve ser mais ou menos isto (não testei):

;WITH TabelaTemporaria AS
(
SELECT ItemNames.ItemID AS ref, ItemNames.Description AS design, ItemSellingPrices.UnitPrice AS preco, Stock.Availableqty AS stock, Item.FamilyID AS familia, ROW_NUMBER() OVER (ORDER BY ItemNames.ItemID) AS Row
FROM Item
INNER JOIN ItemNames ON Item.ItemID=ItemNames.ItemID 
INNER JOIN Stock ON ItemNames.ItemID=Stock.ItemID 
INNER JOIN ItemSellingPrices ON ItemNames.ItemID=ItemSellingPrices.ItemID  
INNER JOIN Family ON Item.FamilyID=Family.FamilyID  
WHERE Stock.WarehouseID=3 AND ItemSellingPrices.PricelineID=1 AND ItemNames.ItemID
)
SELECT * FROM TabelaTemporaria WHERE Row>5 and Row<10

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.