PSN jschut_82 | Xbox: JSchut82
I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.
Zou je dit iets toe willen lichten?Feyd-Rautha schreef op 22 april 2004 @ 12:54:
Misschien kun je er een Stored Procedure voor schrijven, hand in hand met een cursor.
PSN jschut_82 | Xbox: JSchut82
[ Voor 7% gewijzigd door easydisk op 22-04-2004 12:58 ]
Op die manier heb je dan een soort rijnummers.
Cursors moet je zoveel mogelijk vermijden, want dat is erg slecht voor je performance.Feyd-Rautha schreef op 22 april 2004 @ 12:54:
Misschien kun je er een Stored Procedure voor schrijven, hand in hand met een cursor.
Never underestimate the power of
Het probleem is dat de id's niet op volgorde staan.....easydisk schreef op 22 april 2004 @ 12:58:
Misschien kan je inbakken dat dat id = 1 + "Een getal is deelbaar door 3, als de som van de cijfers deelbaar is door 3."
Een temp table is geen optiecameodski schreef op 22 april 2004 @ 12:58:
Je kunt je data eerst in een temporary table zetten waarin een autonumber kolom (IDENTITY) zit.
Op die manier heb je dan een soort rijnummers.
[...]
Cursors moet je zoveel mogelijk vermijden, want dat is erg slecht voor je performance.
[ Voor 43% gewijzigd door JSchut op 22-04-2004 13:04 ]
PSN jschut_82 | Xbox: JSchut82
Voordat je je SQL uitvoert bouw je je lijst met ID's op, en die geef je vervolgens mee in je Stored procedure....
Jails
Het moven van de data naar een temp-table lijkt me nogtans ook niet echt performant.cameodski schreef op 22 april 2004 @ 12:58:
Je kunt je data eerst in een temporary table zetten waarin een autonumber kolom (IDENTITY) zit.
Op die manier heb je dan een soort rijnummers.
Je overloopt eerst je originele table en daarna moet die temptable dan nog eens overlopen.
Ik heb wel geen echt idee hoe inperformant cursors zijn...
I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.
Waarom niet?
[ Voor 55% gewijzigd door whoami op 22-04-2004 13:05 ]
https://fgheysels.github.io/
Ja, je doet inderdaad dubbel werk, maar als je alleen de PK's in de temp table opneemt, scheelt dat al een heleboel.Feyd-Rautha schreef op 22 april 2004 @ 13:03:
[...]
Het moven van de data naar een temp-table lijkt me nogtans ook niet echt performant.
Je overloopt eerst je originele table en daarna moet die temptable dan nog eens overlopen.
Ik heb wel geen echt idee hoe inperformant cursors zijn...
Overigens heb je met een cursor ook een temp table nodig, want je zult toch je resultset ergens moeten opbouwen.
Een temp table is geen optie? Je mag het ook in een permanente table doen als je dat leuker vindt.
Ik denk dat je niet veel keus hebt. Of je moet een hele super intelligente query bouwen, maar ik kan er in ieder geval nog niet één bedenken.
Als je trouwens MSSQL 2000 gebruikt, kun je ook gebruik maken van het table datatype.
En hoe wilde je die ID's dan gaan bepalen. Lijkt me toch dat je dat ook met een query zult moeten doen. En die query kun je dus ook in je stored procudure zetten en dan hoef je dus ook geen lijst met ID's mee te geven.Jails schreef op 22 april 2004 @ 13:02:
Volgens mij moet je een Stored Procedure schrijven die een parameter-list accepteert.
Voordat je je SQL uitvoert bouw je je lijst met ID's op, en die geef je vervolgens mee in je Stored procedure....
Lijsten met ID's zijn overigens ook erg vies en als het kan, moet je die vermijden.
[ Voor 54% gewijzigd door cameodski op 22-04-2004 13:16 ]
Never underestimate the power of
Verwijderd
De eerste stap is om te bepalen welke positie elke naam heeft. Dit is natuurlijk om te bepalen welke naam wel (elke 3de) en welke naam niet (elke 1ste en 2de) in het resultaat moet komen. De positie van elke naam in de lijst is eenvoudig te bepalen als je bedenkt dat de positie van een naam gelijk is aan de count van het aantal namen dat kleiner is dan zichzelf.
Dit kan met deze query:
1
2
3
4
5
| select name , (select count(*) from table t2 where t2.name < t1.name and parent=1) "position" from table t1 where parent=1 order by t1.name |
Nu heb je dus een lijst met namen en hun positie. Deze lijst kan je dan weer verwerken in een nieuwe query die alleen maar de namen selecteert waarvan de positie deelbaar is door 3.
Als volgt:
1
2
3
4
5
6
7
8
| select name, position
from ( select name
, (select count(*) from table t2 where t2.name < t1.name and parent=1) "position"
from table t1
and parent = 1
) as temptable
where position % 3 = 0
order by name |
Dit zou moeten werken. Ik heb het niet helemaal kunnen testen omdat ik geen tabel heb met de naam "table"
[ Voor 5% gewijzigd door Verwijderd op 22-04-2004 14:17 ]
Aan deze optie heb ik inderdaad ook zitten denken, maar omdat subqueries op deze manier erg slecht zijn voor de performance, heb ik dit alternatief maar weggelaten.Verwijderd schreef op 22 april 2004 @ 13:42:
Over performance heb ik niet nagedacht. Je moet zelf maar bekijken of het in jouw situatie bruikbaar is.
Never underestimate the power of
Verwijderd
Tja, wat is performance. Omdat de topic starter helemaal niets verteld over zijn environment is het ook moeilijk om uitspraken te doen over performance. Ik weet b.v. niet hoe groot zijn tabellen zijn en hoevaak deze query uitgevoerd moet worden.cameodski schreef op 22 april 2004 @ 13:48:
maar omdat subqueries op deze manier erg slecht zijn voor de performance, heb ik dit alternatief maar weggelaten.
Als zijn tabel 1.000.000 records bevat en de query moet 1000x per minuut uitgevoerd worden dan heb je waarschijnlijk een probleem. Maar als de tabel maar 1000 records bevat of de query hoeft maar 1x per dag uitgevoerd te worden dan is het een heel ander verhaal.
Daarom heb ik deze oplossing maar wel gepost.
Tja, het is maar wat voor insteek je kiest. Ik heb zoveel ellende meegemaakt met dergelijke trage subqueries, dat ik zoiets niet meer durf te posten als er een beter alternatief is.Verwijderd schreef op 22 april 2004 @ 13:56:
[...]
Tja, wat is performance. Omdat de topic starter helemaal niets verteld over zijn environment is het ook moeilijk om uitspraken te doen over performance. Ik weet b.v. niet hoe groot zijn tabellen zijn en hoevaak deze query uitgevoerd moet worden.
Als zijn tabel 1.000.000 records bevat en de query moet 1000x per minuut uitgevoerd worden dan heb je waarschijnlijk een probleem. Maar als de tabel maar 1000 records bevat of de query hoeft maar 1x per dag uitgevoerd te worden dan is het een heel ander verhaal.
Daarom heb ik deze oplossing maar wel gepost.
Never underestimate the power of