[MS SQL] SELECT meerdere records ipv 1 record

Pagina: 1
Acties:

  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 30-04 19:47
Ik ben op zoek naar een juiste methode om meerdere records op te halen aan de hand van 1 record. Het aantal keren dat deze record wordt opgehaald is afhankelijk van een aantal dat in deze tabel staat. dus:

code:
1
2
3
naam           achternaam         aantal
'Peters R.'   'de Vries'          2
'Klaas'       'Bruinsma'          2

moet worden
code:
1
2
3
4
5
naam           achternaam
'Peters R'.    'de Vries'
'Peters R.'    'de Vries'
'Klaas'        'Bruinsma'
'Klaas'        'Bruinsma'


Ik zou het in een soort loop kunnen doen waar ik een select doe op de desbetreffende tabel, en in een soort WHILE loop loopen op aantal, maar ik vraag me af of het niet makkelijker kan. Eigenlijk is het een soort tegenovergestelde van een DISTINCT die afhankelijk is van de kolom aantal.

[ Voor 13% gewijzigd door stp_4 op 17-01-2005 11:36 ]

stp - PSN ID: stp_4


  • twixx
  • Registratie: April 2000
  • Niet online
Volgens mij staat dit haaks op de basics van een relationele database. Ik denk dat je het hoger op moet gaan zoeken ipv voor dit probleem een oplossing te vinden.

9x Canadian Solar + Enphase IQ7+ 3,4 kWp ZZW 20º
4x Yingli + Enphase IQ7 1 kWp ZZW 25º
4x Yingli + Enphase IQ7 1 kWp ZZW 90º


  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Kan je dit niet beter aan de presentatie/output kant regelen met een lusje dat de 'aantal' column gebruikt ?

  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 30-04 19:47
De database is relationeel, het gaat om een geval waarop de data op deze manier getoond moet worden aan de gebruiker.

stp - PSN ID: stp_4


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Helemaal eens met bovenstaande, maar hier is laatst een topic geweest waarin een aantal mogelijke antwoorden geplaatst zijn, even goed zoeken in dit forum dus.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:38
Ik heb het ooit eens gedaan dmv een 'dummy tabel'.

Die dummy tabel ziet er bv als volgt uit:
2 kolommen: id (prim key) en waarde (integer).
In die dummy tabel stop je bv 10 records, waarbij waarde van 1 tot 10 loopt.

Nu kan je je gewenste resultaat bekomen door een cartesisch product te forceren, door die dummy tabel in je query op te nemen maar niet te joinen.
Je kan de column 'waarde' gebruiken om te bepalen hoeveel keer het record moet voorkomen:

code:
1
2
3
select persoon.*
from persoon, dummy
where dummy.waarde <= persoon.aantal

https://fgheysels.github.io/


Verwijderd

Dat is een oplossing. Maar ik ben echt benieuwd hoe het datamodel van die database eruit ziet. Een tabel met namen en het aantal keer dat ze voorkomen...


Het kan natuurlijk wel zo zijn dat het is voor een of anders statistisch project waar ze het aantal keer dat een naam voorkomt per regio hebben gemeten.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:38
Verwijderd schreef op maandag 17 januari 2005 @ 11:47:
Dat is een oplossing. Maar ik ben echt benieuwd hoe het datamodel van die database eruit ziet. Een tabel met namen en het aantal keer dat ze voorkomen...
Hmm, het kan zijn dat er bv. in de tabel 'Personen' een veld is opgenomen die aangeeft hoeveel etiketten er voor iedere persoon moeten geprint worden. (Ik zeg maar wat).

https://fgheysels.github.io/


  • lier
  • Registratie: Januari 2004
  • Laatst online: 21:57

lier

MikroTik nerd

stp_4 schreef op maandag 17 januari 2005 @ 11:33:
Ik ben op zoek naar een juiste methode om meerdere records op te halen aan de hand van 1 record. Het aantal keren dat deze record wordt opgehaald is afhankelijk van een aantal dat in deze tabel staat. dus:

code:
1
2
3
naam           achternaam         aantal
'Peters R.'   'de Vries'          2
'Klaas'       'Bruinsma'          2

moet worden
code:
1
2
3
4
5
naam           achternaam
'Peters R'.    'de Vries'
'Peters R.'    'de Vries'
'Klaas'        'Bruinsma'
'Klaas'        'Bruinsma'


Ik zou het in een soort loop kunnen doen waar ik een select doe op de desbetreffende tabel, en in een soort WHILE loop loopen op aantal, maar ik vraag me af of het niet makkelijker kan. Eigenlijk is het een soort tegenovergestelde van een DISTINCT die afhankelijk is van de kolom aantal.
Blijkbaar maak je gebruik van (minimaal) 2 tabellen, om de eerste resultaatset te tonen. Dit zal waarschijnlijk met een count voor de derde kolom, in combinatie met een group by (?) voor de eerste twee velden.

Als je de relatie tussen de tabellen bewaard en je haalt de count en de group by weg, dan heb je (volgens mij) de tweede resultaatset.

Feit blijft dat het niet duidelijk is waarom je de tweede resultaatset zou willen hebben, terwijl je de eerste al hebt.

Manier van presenteren van data doe je in de presentatielaag en niet in de datalaag...

[ Voor 12% gewijzigd door lier op 17-01-2005 13:28 ]

Eerst het probleem, dan de oplossing


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 30-04 19:47
Verwijderd schreef op maandag 17 januari 2005 @ 11:47:
Dat is een oplossing. Maar ik ben echt benieuwd hoe het datamodel van die database eruit ziet. Een tabel met namen en het aantal keer dat ze voorkomen...


Het kan natuurlijk wel zo zijn dat het is voor een of anders statistisch project waar ze het aantal keer dat een naam voorkomt per regio hebben gemeten.
Het voorbeeld dat ik noemde is een zeer vereenvoudigde omschrijving van het probleem. In het kort gaat het om een kruistabel met daarin contract id's, product id's en het aantal producten voor dit contract id.

stp - PSN ID: stp_4


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-05 18:53

Bosmonster

*zucht*

whoami schreef op maandag 17 januari 2005 @ 11:50:
[...]

Hmm, het kan zijn dat er bv. in de tabel 'Personen' een veld is opgenomen die aangeeft hoeveel etiketten er voor iedere persoon moeten geprint worden. (Ik zeg maar wat).
En dat ga je met een dummy-tabel enzo oplossen en niet eenvoudig in je software?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:38
Bosmonster schreef op maandag 17 januari 2005 @ 12:07:
[...]


En dat ga je met een dummy-tabel enzo oplossen en niet eenvoudig in je software?
Mjah, het is natuurlijk het best om het in je software op te lossen, maar dat is niet altijd mogelijk.

https://fgheysels.github.io/


  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

lier schreef op maandag 17 januari 2005 @ 11:54:
[...]

Manier van presenteren van data doe je in de datalaag en niet in de datalaag...
Moet 1 van de twee niet applicatielaag zijn :Y)

  • Antediluvian
  • Registratie: Maart 2002
  • Laatst online: 11-05 21:00
TheRookie schreef op maandag 17 januari 2005 @ 12:40:
[...]

Moet 1 van de twee niet applicatielaag zijn :Y)
Presentatielaag zal je bedoelen :+

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Idd :D
(wel goed verbeteren natuurlijk |:()

  • lier
  • Registratie: Januari 2004
  • Laatst online: 21:57

lier

MikroTik nerd

offtopic:
tx all...zie edit


Ben benieuwd naar de reactie van de topic starter...

Eerst het probleem, dan de oplossing


Verwijderd

Ik heb even deze query op de sysdatabases uitgevoerd.
De query pakt de column dbid (dus voor jou aantal) en pakt die aantal als variable, en die loopt totdat ie op 0 staat. Wat het nut hiervan is....search me. Maar heb je hier wat aan?


declare @num int, @DB varchar(200)
DECLARE Database_Cursor cursor FOR SELECT name , dbid FROM sysdatabases
OPEN Database_Cursor
FETCH next FROM Database_Cursor INTO @DB , @num
WHILE @@fetch_status = 0
begin
while @num <> 0
begin
-- ipv print, een insert into ....
print 'naam' + @DB
print @num
set @num = @num - 1
end
FETCH next FROM Database_Cursor INTO @DB , @num
end
CLOSE Database_Cursor
DEALLOCATE Database_Cursor


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

NMe

Quia Ego Sic Dico.

whoami schreef op maandag 17 januari 2005 @ 11:44:
Ik heb het ooit eens gedaan dmv een 'dummy tabel'.

Die dummy tabel ziet er bv als volgt uit:
2 kolommen: id (prim key) en waarde (integer).
In die dummy tabel stop je bv 10 records, waarbij waarde van 1 tot 10 loopt.

Nu kan je je gewenste resultaat bekomen door een cartesisch product te forceren, door die dummy tabel in je query op te nemen maar niet te joinen.
Je kan de column 'waarde' gebruiken om te bepalen hoeveel keer het record moet voorkomen:

code:
1
2
3
select persoon.*
from persoon, dummy
where dummy.waarde <= persoon.aantal
Kun je datzelfde effect niet bereiken, zonder dummytabel? Door gewoon een tabel met zichzelf te joinen? (Uiteraard wel met een alias. :P)

'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.


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 30-04 19:47
Ik dacht dat ik al wat gepost had maar die is niet helemaal gelukt zo te zien. Ik ben het er mee eens dat dit soort zaken op de presentatielaag afgehandeld moeten worden. Met behulp van een loop in m'n code bepaal ik hoe vaak een bepaald record getoond moet worden m.b.v. kolom aantal uit de tabel. Lijkt me inderdaad de eenvoudigste en beste methode.

stp - PSN ID: stp_4

Pagina: 1