Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!
[ Voor 180% gewijzigd door BtM909 op 18-09-2008 15:43 ]
Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.
Sorry er vergeten bij te melden.BtM909 schreef op donderdag 18 september 2008 @ 15:40:
Welke SQL server gebruik je?
Ik gebruik SQL Server 2000
Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!
Als ik overigens ga [google=MS-SQL show result in (1 or single) row], dan krijg ik al een hoop relevante resultaten (welke in dit geval specifiek voor MS-SQL zijn).
Geef met name in je topicstart aan waar je op hebt gezocht, wat je hebt gevonden en waarom de geboden oplossingen geen resultaat boden.
Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.
Zoek die eens op.
Alles kan stuk.
Onder Microsoft SQL Server gaat het niet zo handig, heb het laatst wel laten maken maar het resulteerde in een view die zoiezo niet oneindig schaalbaar is in rijen (met een hard aantal erin).
tubby.nl - Artes Moriendi - q1 - bf1942 - WoT - pubg - LinkedIN
Maw: je moet SQL niet gebruiken om dit te verwezenlijken, maar doe dit in je 'client' code. (C#, Delphi, VB, whatever).
Wil je het toch doen, dan kan je best een UDF (user defined function) maken die dit voor jou doet.
https://fgheysels.github.io/
Oftewel als COUNT = 1 dan SELECT TOP 1 * FROM enz, en als COUNT = 2 dan SELECT TOP 2 * FROM enz. Het hoogst haalbare is 4 dus dat is nog wel te toen, krijg je misschien wel een grote code, maarja zolang het maar snel en werkbaar is
Iedereen bedankt voor alle antwoorden!!!!
@BtM909: Ik zal in het vervolg wat meer opschrijven, met alles wat ik zelf geprobeerd heb.
Greetz,
Scheffer
Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!
https://fgheysels.github.io/
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Met TOP kan ik een bepaalde rij pakken, als de count 3 is en ik wil de 3e hebben dan kan ik de eerste uitsluiten door er later bij te vertellen dat ik TOP2 niet hoef te hebben.whoami schreef op donderdag 18 september 2008 @ 16:26:
Eh, beats me maar wat heeft 'TOP' te maken met het probleem uit je topicstart ? Met TOP beperk je gewoon het aantal rijen in je resultset
Dus TOP, dan TOP (TOP1, sluit de eerste uit) en dan TOP (TOP, sluit de eerste 2 uit) en dan kan ik ze gewoon samenvoegen met VB.NET en dan heb ik zoals ik wou een samengevoegde variabele.
[ Voor 18% gewijzigd door Scheffer op 18-09-2008 16:50 ]
Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!
1
2
3
4
5
6
| string meuk=""; //db meuk while(datareader.Read()) { meuk=meuk + datareader["naam"].tostring(); } |
Lijkt me logischer dan ~3 keer een query met TOP uit te voeren.
Ik weet het niet zeker, maar het kan dat een TOP een full-table-scan uitvoert, en dat wil je eigenlijk ook weer niet voor zoiets triviaals als dit.
Heart..pumps blood.Has nothing to do with emotion! Bored
Ik zal er eens naar kijken, maar de TOP functie gaat niet de hele tabel door, je kunt gewoon bijvoorbeeld WHERE Achternaam = 'Tweakers' meegevenTeeDee schreef op donderdag 18 september 2008 @ 16:54:
Beetje overkill imo.
C#:
1 2 3 4 5 6 string meuk=""; //db meuk while(datareader.Read()) { meuk=meuk + datareader["naam"].tostring(); }
Lijkt me logischer dan ~3 keer een query met TOP uit te voeren.
Ik weet het niet zeker, maar het kan dat een TOP een full-table-scan uitvoert, en dat wil je eigenlijk ook weer niet voor zoiets triviaals als dit.
Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!
Dat wil nog niets zeggen hé.Scheffer schreef op donderdag 18 september 2008 @ 17:04:
[...]
Ik zal er eens naar kijken, maar de TOP functie gaat niet de hele tabel door, je kunt gewoon bijvoorbeeld WHERE Achternaam = 'Tweakers' meegeven
Als je een SELECT TOP ... ORDER BY doet, dan zal SQL Server toch eerst de gehele resultset ophalen, deze sorteren, en dan pas de TOP toepassen.
https://fgheysels.github.io/
Scheffer schreef op donderdag 18 september 2008 @ 17:04:
[...]
Ik zal er eens naar kijken, maar de TOP functie gaat niet de hele tabel door, je kunt gewoon bijvoorbeeld WHERE Achternaam = 'Tweakers' meegeven

Seriously: neem eens een tutorial SQL/Programmeren. Wat ik er van begrijp (en dat is nogal vaag nu) is dat je alle personen op wil halen met de naam 'janssen' en dan (bijv) de voornamen aan elkaar plakken?
Dan doe je dus in SQL: select voornaam from personen where achternaam = 'janssen'
En daarna loop je in je code door die dataset heen en concat je de namen aan elkaar. Niks geen top's, niks geen 'door de hele tabel heen lopen'. Precies wat whoami zegt, en ook de enige juiste oplossing imho. Ja, er zijn ranzige geintjes uit te halen met udf's en (onder MySQL bijv. Group_Concat) maar dat soort zaken wil je helemaal niet door je DBMS laten afhandelen.
Hoe je bij zaken als 'Cursor Fast_Forward' en 'TOP' terecht komt, die werkelijk niets met het eigenlijke probleem te maken hebben, is mij een raadsel en wijst er gewoon op dat je de basiskennis nog ontbeert. Dat is niet om je af te vlammen of voor je schenen te schoppen maar gewoon een teken dat je je er wat meer in moet verdiepen en er wat meer van moet leren; dat hebben wij ook allemaal ooit moeten doen
[ Voor 31% gewijzigd door RobIII op 18-09-2008 17:12 ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
Blijkt maar weer hoe weinig verstand ik van SQL hebwhoami schreef op donderdag 18 september 2008 @ 17:06:
[...]
Dat wil nog niets zeggen hé.
Als je een SELECT TOP ... ORDER BY doet, dan zal SQL Server toch eerst de gehele resultset ophalen, deze sorteren, en dan pas de TOP toepassen.
Oftewel ik moet gewoon de data ophalen met bijvoorbeeld: SELECT Naam FROM tbl_Naam WHERE Achternaam = 'Tweakers' en daarna deze in VB.Net bewerken...kom ik weer meteen aan het begin van me vraag uit, hoe krijg ik dit in 1 variabele...:S
Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!
Zoals ik dus reeds vaststeldeScheffer schreef op donderdag 18 september 2008 @ 17:12:
Blijkt maar weer hoe weinig verstand ik van SQL heb
En vandaar dat ik ook "tutorial programmeren" erbij noemde; dit is écht basiskennis. Door je resultsetje heen itereren en met een stringbuilder de waardes aan elkaar plakken is écht geen rocket scienceScheffer schreef op donderdag 18 september 2008 @ 17:12:
hoe krijg ik dit in 1 variabele...:S
TeeDee's post geeft al een goed begin; hoewel ik zelf een stringbuilder zou gebruiken, maar dat zijn details.
Again; het is helemaal niet erg als je ergens (nog) niet in thuis bent of geen kaas van hebt gegeten, maar dit zijn gewoon echt basis dingetjes en we verwachten hier dat je toch wel enigszins de basis onder de knie hebt voor je een topic opent
[ Voor 32% gewijzigd door RobIII op 18-09-2008 17:16 ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
En het is nog niet in je opgekomen om mijn code even te bekijken? Weliswaar in C# maar is dusdanig makkelijk dat je dat in een zucht en een scheet in VB.net hebt.Scheffer schreef op donderdag 18 september 2008 @ 17:12:
[...]
daarna deze in VB.Net bewerken...kom ik weer meteen aan het begin van me vraag uit, hoe krijg ik dit in 1 variabele...:S
Heart..pumps blood.Has nothing to do with emotion! Bored
Dit kun je inderdaad doen met de functie COALESCE4of9 schreef op donderdag 18 september 2008 @ 16:41:
Met de functie COALESCE en een user defined function kom je een eind denk ik...
1
2
3
| SELECT @sHulp = COALESCE(@sHulp + ', ','') + Rtrim(Naam) FROM tbl_Naam WHERE Achternaam = 'Tweakers' |
De namen was bedoeld als voorbeeld, in werkelijkheid komt het er op neer dat we hier een tabel hebben met alle geplande monteurs, in die tabel staat de ID,MonteurID,OrderID. ID is de ID van de eigen tabel, MonteurID is de ID van de tabel tbl_Monteurs en de OrderID is van de tabel tbl_Orderverwerking.RobIII schreef op donderdag 18 september 2008 @ 17:08:
[...]
![]()
Seriously: neem eens een tutorial SQL/Programmeren. Wat ik er van begrijp (en dat is nogal vaag nu) is dat je alle personen op wil halen met de naam 'janssen' en dan (bijv) de voornamen aan elkaar plakken?
Dan doe je dus in SQL: select voornaam from personen where achternaam = 'janssen'
En daarna loop je in je code door die dataset heen en concat je de namen aan elkaar. Niks geen top's, niks geen 'door de hele tabel heen lopen'. Precies wat whoami zegt, en ook de enige juiste oplossing imho. Ja, er zijn ranzige geintjes uit te halen met udf's en (onder MySQL bijv. Group_Concat) maar dat soort zaken wil je helemaal niet door je DBMS laten afhandelen.
Hoe je bij zaken als 'Cursor Fast_Forward' en 'TOP' terecht komt, die werkelijk niets met het eigenlijke probleem te maken hebben, is mij een raadsel en wijst er gewoon op dat je de basiskennis nog ontbeert. Dat is niet om je af te vlammen of voor je schenen te schoppen maar gewoon een teken dat je je er wat meer in moet verdiepen en er wat meer van moet leren; dat hebben wij ook allemaal ooit moeten doen
Vanuit die tabel wil ik weten wie er heeft gewerkt aan een bepaalde order en omdat het alleen ter info is wil ik de namen graag samengevoegd hebben tot 1 variabele, deze zal hooguit 3 tot 5 namen bevatten, meer monteurs zullen er niet op een order zitten.
Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!
Dat maakt toch geen verschil? Dat verandert niets aan wat je hier verteld wordt.Scheffer schreef op donderdag 18 september 2008 @ 17:17:
De namen was bedoeld als voorbeeld, in werkelijkheid komt het er op neer dat we hier een tabel hebben met alle geplande monteurs, in die tabel staat de ID,MonteurID,OrderID. ID is de ID van de eigen tabel, MonteurID is de ID van de tabel tbl_Monteurs en de OrderID is van de tabel tbl_Orderverwerking.
En again; ik zie het verschil niet? En waarom dat dat gedoe met die TOP's zou rechtvaardigen is me net zo'n raadsel.Scheffer schreef op donderdag 18 september 2008 @ 17:17:
Vanuit die tabel wil ik weten wie er heeft gewerkt aan een bepaalde order en omdat het alleen ter info is wil ik de namen graag samengevoegd hebben tot 1 variabele, deze zal hooguit 3 tot 5 namen bevatten, meer monteurs zullen er niet op een order zitten.
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
In ieder geval bedankt voor alle antwoorden en ik ga meteen eens even klieren met het antwoord van Meatlove en TeeDee.
Mocht ik iemand agressief hebben gemaakt met mijn vragen dan zou ik maar een stukje gaan rennen
Nogmaals bedankt voor alle info en mijn excuses voor de overlast.
Greetz,
Scheffer
Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!
Nee, dat kan je niet want COALESCE werkt op column niveau, en niet op set niveau.MeatLoaf schreef op donderdag 18 september 2008 @ 17:16:
[...]
Dit kun je inderdaad doen met de functie COALESCE
SQL:
1 2 3 SELECT @sHulp = COALESCE(@sHulp + ', ','') + Rtrim(Naam) FROM tbl_Naam WHERE Achternaam = 'Tweakers'
https://fgheysels.github.io/
1
2
3
4
5
| declare @x varchar(2000) update <table> set @x = name + " " + @x where <condition> |
misschien werkt het op ms sql nog steeds
[ Voor 5% gewijzigd door dvvelzen op 19-09-2008 06:22 ]
Dat kan wel.whoami schreef op donderdag 18 september 2008 @ 18:51:
[...]
Nee, dat kan je niet want COALESCE werkt op column niveau, en niet op set niveau.
De TS zegt:
en dat kan perfect met COALESCEDeze moeten samengevoegd worden in 1 variabele zodat dit de uitkomst is: Jan,Sjaak,Piet
Gooi dit maar eens in de query analyzer
1
2
3
4
5
6
| declare @s NVARCHAR(4000) SELECT @s = COALESCE(@s+ ',','') + Naam from tbl_Naam where Achternaam = 'Tweakers' PRINT @s |
daar komt uit
Jan,Piet,Kees
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Verwijderd
Al gebruik je de coalesce natuurlijk niet voor het samenvoegen maar om aan het eind geen komma te krijgen.. Maar dat is een detail :-)
Moraal van het verhaal: niet miepen en geen presentatie in je database-layer leggen. Je hebt nu 4 regels SQL nodig voor iets dat met 4 regels VB.NET of C# net zo goed kan en ten gevolge van de correcte locatie van de functionaliteit wel future-proof en beter maintainable is.