[mssql] paging MSSQL geeft problemen bij een JOIN

Pagina: 1
Acties:

  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
Ik ben bezig met het maken van een overzicht van geregistreerde gebruikers. omdat dit er erg veel zijn maak ik verschillende pagina's. per pagina worden er 20 gebruikers getoond. Het is mogelijk om dit met een ID te doen maar omdat er steeds leden bijkomen en de leden op alfabetische volgorde weergegeven moeten worden.

Ik weet dat het in MSSQL mogelijk is om een index mee tegeven zodat de tabel automatisch op alfabetesche volgorde gezet kan worden maar dat is niet de bedoeling omdat de applicatie ook op MySQL werkt. En daar wordt gewoon een limit meegegeven. Omdat de applicatie zowel op MySQL en MSSQL moet werken moet ik dus het aanroepen van de Query onafhankelijk maken.

Bij MySQL moet er een begin waarde meegegeven worden en hoeveel rijen dus
code:
1
Limit 0,20

Ik kan deze waarde ook gebruikeren voor MSSQL. Namelijk zo
code:
1
2
3
4
5
6
7
select * from (
 select top 20 * from (
    select top 100 *
    from gebruiker 
   order by gebruiker  asc
 ) as aantal order by gebruiker desc
) as aantal1 order by gebruiker  asc

Dus in deze query wil ik de top 20 hebben vanaf de top 100. Dus de eerste 20 gebruikers na de eerste 100 gebruikers. Dus krijg ik gebruikers 101 t/m 120

Dit werkt perfect maar ik wil niet zomaar alle gebruikers selecteren maar ik wil een RIGHT JOIN doen. Dus ik doe dit.
code:
1
2
3
select * from ( select top 10 * from ( select top10 0 * from gebruiker RIGHT JOIN 
gebruiker_adressen ON gebruiker_adressen.ID = gebruiker.ID order by gebruiker asc ) as 
aantal order by gebruiker decs) as aantal1 order by gebruiker asc

Nu onstaat er een error. De Query analyser geeft deze error.

The column 'ID' was specified multiple times for 'aantal'.

Dus de JOIN werkt niet 8)7 Ik doe een JOIN op 2 verschillende tabellen en dus 2 verschillende ID's maar dat werkt niet. |:(

Ik heb geprobeert alliassen aan de tabellen mee te geven maar het probleem zit hem niet in de tabellen maar de server denkt dat het gaat om de zelfde kolom denk ik

Jochemmol


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Aliassen?

Verder zie ik volgens mij nogal wat tikfouten... "top10 0"? "decs"? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Jochemmol schreef op dinsdag 12 juli 2005 @ 12:34:
Bij MySQL moet er een begin waarde meegegeven worden en hoeveel rijen dus
code:
1
Limit 0,20

Ik kan deze waarde ook gebruikeren voor MSSQL. Namelijk zo
code:
1
2
3
4
5
6
7
select * from (
 select top 20 * from (
    select top 100 *
    from gebruiker 
   order by gebruiker  asc
 ) as aantal order by gebruiker desc
) as aantal1 order by gebruiker  asc

Dus in deze query wil ik de top 20 hebben vanaf de top 100. Dus de eerste 20 gebruikers na de eerste 100 gebruikers. Dus krijg ik gebruikers 101 t/m 120

Dit werkt perfect maar ik wil niet zomaar alle gebruikers selecteren maar ik wil een RIGHT JOIN doen.
Dit werkt 'perfect' ? Volgens mij levert die query van jou altijd de 1e 20 op :)

Paging op SqlServer is een ramp, laten we daar maar mee beginnen. Behalve op Access is er geen database die zo triest met het fenomeen paging omgaat.

Er is geen echte 'holy grail' mbt pagin op sqlserver, maar door de bank genomen is een temptable oplossing de meest efficientste, gemiddeld gezien. Je kunt met truuks soms wat snellere paging krijgen, maar dan moet je per situatie een paging query schrijven, want in andere gevallen werken die truuks bv niet.

De temp table heeft hetzelfde schema als jouw resultset met 1 extra column: een rownum column die een identity column is.

Dan select je je resultset and geeft een TOP mee van pagesize * (pageno +1) . Daarna select je mbt de rownum de juiste page uit je temptable.

Kijk wel uit bij duplicates in je query, als gevolg van left/right joins. Dit kan nl. duplicates opleveren die allen een row bezet houden maar die je niet wilt in de resultset, dus dat je een page hebt met 20 keer hetzelfde record.

Je kunt dan 'DISTINCT' toevoegen maar dat kan problemen opleveren bij resultsets met image/ntext/text columns. Je zult dan op de client moeten pagen (resultset ophalen en lezen totdat je de page hebt gelezen. Op zich niet eens zo bar traag, want niet veel users pagen naar page 10000000324343

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
Oke bedankt ik ga er eens naar kijken. Sorry voor de typfouten die komen doordat ik de query uit de query analyser heb gecopieerd maar in de code klopt hij wel. Alliassen die gebruik ik om een tabel in de code een andere naam te geven.

Maar ik heb hier limit 0,20 ingevult maar in de code is deze variabel. dat zijn waarde die ik meegeef als ik de query genereer.

Maar ik ga eens proberen of ik het kan oplossen met jullie tips.

Jochemmol


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Jochemmol schreef op dinsdag 12 juli 2005 @ 13:28:
Alliassen die gebruik ik om een tabel in de code een andere naam te geven.
offtopic:
Ik bedoelde eigenlijk dat je aliassen wel eens kon proberen. Ik had over het laatste zinnetjes van je topicstart heen gelezen, dus ik wist niet dat je dat al geprobeerd had. Sorry. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Waarom het fout gaat:
SQL:
1
2
(select top 100 * from gebruiker RIGHT JOIN 
gebruiker_adressen ON gebruiker_adressen.ID = gebruiker.ID order by gebruiker asc) as aantal
Dit produceert een table met 2 keer de kolom ID (eenmaal uit gebruiker en eenmaal uit gebruiker_adressen), en dat komt omdat jij gewoon botweg 'select *' doet. Niet doen dus, je moet individuele kolommen selecteren. Desnoods doe je dit:
SQL:
1
select top 100 gebruiker, gebruiker_adressen.* from ...


Overigens, wat ik hier al voorbij heb zien komen, het paging gedeelte van je query werkt niet, dat produceert namelijk de laatste 10 (of 20) van de eerste 100 records.

Een tip: als je een query met een of meer subquery's hebt, voer ze dan los uit in de query analyzer (of enterprise manager), dat verklaart meestal een boel.

[ Voor 12% gewijzigd door Korben op 13-07-2005 01:17 ]

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
Je heb gelijk. Ik krijg alleen de laatste 10 van de 100 in plaats van de eerste 10 na de honderd

Ik los dit zo op door de top honderd met het aantal dat ik wil hebben na de 100 op te hogen

Ik had de query's al apart getest en bije werkte ze goed. Daarom begreep ik het niet. Maar bedankt. Stomme fout van me. Gewoon netjes alles sprecificeren :X

[ Voor 36% gewijzigd door Jochemmol op 13-07-2005 13:56 ]

Jochemmol

Pagina: 1