Avatar billede jenslyn_s Nybegynder
01. november 2007 - 12:32 Der er 5 kommentarer

Offset i SQL?

Hej. Hvad er alternativet til den herlige offset fra mysql?

Vil gerne lave noget alá:

SELECT TOP 1 OFFSET @offset * FROM girlsfriend WHERE id != @last_fucked_girlfriend
Avatar billede -psycho- Nybegynder
01. november 2007 - 12:54 #1
Der er ikke noget offset som i mysql der er dog et par metoder til at åbne det samme resultat.

Jeg plejer at bruge
SELECT TOP n(amount) * FROM table WHERE id NOT IN (SELECT TOP n(offset) id FROM table)

Men om denne måde er dårligere/bedre performence mæssigt end de andre løsninger ved jeg ikke
Avatar billede -psycho- Nybegynder
01. november 2007 - 13:04 #2
Jeg kan ikke stave der skulle selvfølgelig stå opnå ikke åbne ved ikke lige hvad jeg tænkte på der :D.

Men for at den løsning jeg giver skal virke skal id være unikt f.eks en auto increment
Avatar billede arne_v Ekspert
01. november 2007 - 13:59 #3
Jeg lavede engang en lille demo til et andet spm.:

CREATE TABLE eks1 (
    fpk INTEGER NOT NULL PRIMARY KEY,
    fval VARCHAR(25)
)
GO
INSERT INTO eks1 VALUES (1, '-')
GO
INSERT INTO eks1 VALUES (2, '-')
GO
INSERT INTO eks1 VALUES (3, '-')
GO
INSERT INTO eks1 VALUES (4, '-')
GO
INSERT INTO eks1 VALUES (5, '+')
GO
INSERT INTO eks1 VALUES (6, '+')
GO
INSERT INTO eks1 VALUES (7, '+')
GO
INSERT INTO eks1 VALUES (8, '+')
GO
INSERT INTO eks1 VALUES (9, '+')
GO
INSERT INTO eks1 VALUES (10, '+')
GO
INSERT INTO eks1 VALUES (11, '-')
GO
INSERT INTO eks1 VALUES (12, '-')
GO
INSERT INTO eks1 VALUES (13, '-')
GO
INSERT INTO eks1 VALUES (14, '-')
GO
INSERT INTO eks1 VALUES (15, '-')
GO
SELECT TOP 5 * FROM eks1 WHERE fpk NOT IN (SELECT TOP 5 fpk FROM eks1 ORDER BY fpk) ORDER BY fpk
GO
DROP TABLE eks1
GO
CREATE TABLE eks2 (
    fpk INTEGER NOT NULL IDENTITY(1,1) PRIMARY KEY,
    fnonpk INTEGER,
    fval VARCHAR(25)
)
GO
INSERT INTO eks2 (fnonpk, fval) VALUES (1, '-')
GO
INSERT INTO eks2 (fnonpk, fval) VALUES (1, '-')
GO
INSERT INTO eks2 (fnonpk, fval) VALUES (1, '-')
GO
INSERT INTO eks2 (fnonpk, fval) VALUES (1, '-')
GO
INSERT INTO eks2 (fnonpk, fval) VALUES (2, '?')
GO
INSERT INTO eks2 (fnonpk, fval) VALUES (2, '?')
GO
INSERT INTO eks2 (fnonpk, fval) VALUES (2, '?')
GO
INSERT INTO eks2 (fnonpk, fval) VALUES (2, '?')
GO
INSERT INTO eks2 (fnonpk, fval) VALUES (2, '?')
GO
INSERT INTO eks2 (fnonpk, fval) VALUES (2, '?')
GO
INSERT INTO eks2 (fnonpk, fval) VALUES (2, '?')
GO
INSERT INTO eks2 (fnonpk, fval) VALUES (3, '-')
GO
INSERT INTO eks2 (fnonpk, fval) VALUES (3, '-')
GO
INSERT INTO eks2 (fnonpk, fval) VALUES (3, '-')
GO
INSERT INTO eks2 (fnonpk, fval) VALUES (3, '-')
GO
SELECT TOP 5 * FROM eks2 WHERE fnonpk NOT IN (SELECT TOP 5 fnonpk FROM eks2 ORDER BY fnonpk) ORDER BY fnonpk
GO
SELECT * FROM (SELECT TOP 5 * FROM (SELECT TOP 10 * FROM eks2 ORDER BY fnonpk) x ORDER BY fnonpk DESC) y ORDER BY fnonpk
GO
DROP TABLE eks2
GO
Avatar billede arne_v Ekspert
21. januar 2008 - 04:56 #4
jenslyn ?
Avatar billede HenrikSjang Nybegynder
07. marts 2008 - 23:21 #5
Hvis man tager udgangspunkt i arne_v's eks1 tabel, kan man også benytte en cte, som performer ret godt:


WITH Limit_CTE
AS
(
SELECT
    fpk,
    fval,
    ROW_NUMBER() OVER(ORDER BY fpk) AS RowNumber
FROM eks1
)

SELECT fpk, fval
FROM Limit_CTE
WHERE RowNumber BETWEEN 5 AND 10
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester