Toon posts:

[sql] rijen naar kolommen join query (onmogelijk??)

Pagina: 1
Acties:
  • 239 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
database: mssql 2k.

Ik heb o.a. 3 tabellen die als volgt werken:
tabel 1: ID1, bla, bla, bla
tabel 2: ID2, naam1, naam2, naam3, naam4
tabel 3: ID1, ID2 (koppel tabel)

Dit komt dus neer dat de items in tabel 2 gekoppeld kunnen zijn aan de items in tabel 1 middels een koppeltabel [3].

Ik wil mijn data als volgt terug krijgen:

kolomnaam: ID1, bla, bla, bla, naam1, naam2, naam3, naam4
een rij: 14, xxx, xxx, xxx, true, true, false, false

Waarbij het uiteraard gaat om de true/false's die komen uit de koppeltabel. Een true indien het item gekoppeld is, een false indien dat niet het geval is..

Het probleem zit hem in het samenvoegen van de gegevens en op dit moment zit ik er helemaal doorheen.
Waarom denk je?? Omdat TABEL 2 DYNAMISCH IS. Met andere woorden, ik ken de id's dus niet van tabel 2 en kan dus niet met subselects werken!!!! (ik bedoel met dynamisch: tabel 2 wordt bijgehouden in een cms systeempje en er worden dus items toegevoegd en soms verwijderd).


Wat heb ik gedaan om dit probleem op te lossen?
Ik heb een query/sproc die met een cursor door tabel 2 gaat, de kolommen noteert en gebruikt om te kijken of de koppeling wel of niet bestaat (SELECT count(*) from tabel3 where ID1 = @tabel1ID and ID2 = y.
Dit lukt me. Ik krijg terug een select 0 as naam1, 1 as naam2 etc. etc.

Wat me niet lukt is om iets dergelijks te schrijven:

select tabel1.*, (exec sprocje ) from tabel1 of iets in die trant (ja, ik schrijf de * uit.. duh)

Mijn volgende poging gaat zijn om dan maar 2 cursors te gebruiken.. eentje om door tabel1 heen te gaan, en dan een inner cursor voor de koppeltabel.
OF (gaat poging 3 zijn) om 1 kolom aan tabel 1 toe te voegen (met vaste kolomnaam dus) en daarin een string te zetten van de tabel2 ID's die gekoppeld zijn. In mijn .net code haal ik het wel weer uitelkaar... weet nog niet hoe ik zo'n string kan selecten.


Zit ik hiermee op de juiste weg of is er een VEEL simpelere wijze?? Ik zie even door de bomen het bos niet meer.. 8)7 8)7

[a.u.b. alleen serieuze antwoorden. Dit probleem moet op de sql server worden opgelost, niet door .net code als het even kan] _/-\o_

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
Hmmm.... SQL is er om data uit een DB te halen, te bewerken of erin te proppen. Niet om de lay-out of de manier waarop die data moet getoond worden te verzorgen.

Je kan wel een Stored Procedure schrijven m dat op te lossen (zoals je al gedaan hebt), maar zoals je zelf kunt zien, kan je die niet in je SELECT statement zetten. Een FUNCTION kan je wel in je SELECT statement zetten, maar ik geloof niet dat die het zal toelaten dat je meer dan 1 waarde of een onbekend aantal waardes laat returnen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
kan ik een function gebruiken om bijvoorbeeld een select te doen van de koppeltabel id's en dat in 1 string zetten?? Die functie dan in de kolom proppen.

hoe kan ik die dingen in een string krijgen.....

  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Verwijderd schreef op 30 June 2003 @ 22:07:
kan ik een function gebruiken om bijvoorbeeld een select te doen van de koppeltabel id's en dat in 1 string zetten?? Die functie dan in de kolom proppen.

hoe kan ik die dingen in een string krijgen.....
Zoals Whoami al aangeeft is SQL alleen bedoelt om bewerkingen op een database uit te voeren en niet de weergave van data te bepalen/beinvloeden.
Je zal dus in je applicatie alle geretourneerde waarden in één string moeten zetten :)

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
Verwijderd schreef op 30 June 2003 @ 22:07:
kan ik een function gebruiken om bijvoorbeeld een select te doen van de koppeltabel id's en dat in 1 string zetten?? Die functie dan in de kolom proppen.

hoe kan ik die dingen in een string krijgen.....
Dat kan je doen, maar hou wel in je achterhoofd dat -als je dan nog bewerkingen wilt doen op die data die in die string zit-, het prutswerk zal worden.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik vind jullie een beetje raar hoor. Nee, SQL is niet puur bedoeld om bewerkingen op een db uit te voeren. Het is ook heel duidelijk bedoeld om de data eruit te halen op een manier dat je ermee kan werken.
Stel ik heb 500 records die gekoppeld zijn aan meerdere rows in een andere tabel. Ik hoef alleen maar de id's te hebben van die koppelingen. Op het moment dat ik in mijn code dat soort dingen ga terug halen, zal ik dus 500 extra queries moeten doen, of als ik iets handiger ben, minimaal ook de koppeltabel ophalen en hiermee een relationship aangaan.
Door dat in mijn code te doen belast je de webserver vele malen meer.

Het is veel beter om dat op de sql server zelf te doen met behulp van een function. De function maakt nu een string die er bv. zo uit ziet: *2*5*11*13*.
Als de performance onder die funtie (die dus zelf een loop heeft met een cursor) hieronder te leiden heeft, kan ik gelukkig met een temp. table gaan werken die ik met een job update.

Dat is waar sql server goed voor is!!

Als antwoord op whoami: het zal geen prutswerk worden. Ik heb het al werkende nu (gelukkig!) en het gaat errug goed. Ik krijg in mijn code een ID op en moet checken welke rows hieraan voldoen. Ik gebruik c# dus ik kan in mijn dataview zeggen: Rowfilter = 'columname like %*x*%' en ik ben al klaar..
Overigens heb ik een iets andere oplossing nu, maar het idee is hetzelfde. Ik vind dat geen prutswerk. ..

Al met al ben ik blij,
Wat ik heb geleerd is dat mssql functions toch anders benadert dan bv. sprocs.. Beetje verwarrend, maar wel lekker ;-)

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
Het is volledig afhankelijk van wat je met die data wilt gaan doen.

In jouw geval is het wel OK hoor om dat op SQL niveau te doen. Zeker als je met die data verder niets gaat doen, is het wel de beste manier om het zo op te lossen. (Het is ook de snelste).
* whoami heeft het ook nog zo gedaan ;)

https://fgheysels.github.io/

Pagina: 1