Toon posts:

[SQL server2000] Join 20 keer zelfde gegevens

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi tweakers,
Ik ben vrij leek op programmeer gebied.
Heb de Faq al gelezen over JOINS enz.
Ook genoeg gesearcht maar het wil niet echt lukken, naja wel deels.

ik wil een querie/Join uitvoeren
heb een tabel met nummers die nummers hebben een status.
en een gebruiker tabel die die nummers gebruiken.

ik heb dus wel een querie van alle nummers die op een bepaalde status staan, die goed werkt.
nu wil ik daar aan toevoegen de status van de gebruiker ingelogd/uitgelogd.

code:
1
select sn from tabelsn where status='4'


en ik heb

code:
1
select id,ingelogd from gebruiker


deze wil ik dus combineren nu heb ik dit ik krijg het gewenste resultaat wel
maar elk nummer zie ik dus 20 keer in de result met onderstaande code.
code:
1
2
3
4
select tabelsn.sn, gebruiker.ingelogd
from tabelsn, gebruiker
where tabelsn.sn = gebruiker.ingelogd and tabelsn.status ='4' 
order by ingelogd


kan iemand me een handje helpen?
grtz

  • tymiek
  • Registratie: Januari 2002
  • Laatst online: 12-02 11:10

tymiek

drinkjedrankje slikjeslokje

Ik zou zo snel denken aan DISTINCT gebruiken dus


code:
1
2
3
4
select DISTINCT tabelsn.sn, gebruiker.ingelogd
from tabelsn, gebruiker
where tabelsn.sn = gebruiker.ingelogd and tabelsn.status ='4' 
order by ingelogd


Hier staat wat info erover http://www.w3schools.com/sql/sql_select.asp

[ Voor 14% gewijzigd door tymiek op 05-10-2006 11:32 ]

Iets met een snelle pc/ssd etc geen zin meer om alles op te schrijven :o


  • Titusvh
  • Registratie: Juli 2004
  • Laatst online: 15-11-2025
Verwijderd schreef op donderdag 05 oktober 2006 @ 11:24:

deze wil ik dus combineren nu heb ik dit ik krijg het gewenste resultaat wel
maar elk nummer zie ik dus 20 keer in de result met onderstaande code.
code:
1
2
3
4
select tabelsn.sn, gebruiker.ingelogd
from tabelsn, gebruiker
where tabelsn.sn = gebruiker.ingelogd and tabelsn.status ='4' 
order by ingelogd
Als je een join doet moet dat wel op een zinvolle relatie gebaseerd zijn, anders krijg je een cartetisch product (die je nu dus krijgt).

In principe heb je bij een join tussen tabel A en B in je where clause altijd een stukje
code:
1
 A.primary_key = B.foreign_key
.

Wat ik in jouw query zie is dat je records bij elkaar zoekt waarbij het sn gelijk is aan user_id. Ziet er niet uit als iets dat een geldige relatie is...

In de tabellen moeten de gegevens om de relatie te leggen dus wel aanwezig zijn. Dus bijv. in de sn tabel heb je ook een veld user_id als foreign key.

[ Voor 8% gewijzigd door Titusvh op 05-10-2006 11:44 ]


  • azuidhof
  • Registratie: April 2005
  • Laatst online: 07-01-2022
je dient natuurlijk aan te geven waarop HOE de tabellen geJOINed moeten worden, nu wordt zo'n beetje alles aan elkaar geplakt. Je query zul je dus moeten aanvullen met iets als
code:
1
from tabelsn LEFT JOIN gebruiker ON tabelsn.sleutelveld = gebruiker.andersleutelveld


Geef es een beschrijving van de tabelstructuur want ik kan hier nog niet zo wijs uit (een SELECT op tabelsn.sn, gebruiker.ingelogd bijv. terwijl je ook die 2 velden aan elkaar gelijk stelt met WHERE :? )

Mijn .NET blog!


  • canth
  • Registratie: Augustus 2002
  • Laatst online: 12-02 17:47
Verwijderd schreef op donderdag 05 oktober 2006 @ 11:24:
Hoi tweakers,
Ik ben vrij leek op programmeer gebied.
Heb de Faq al gelezen over JOINS enz.
Ook genoeg gesearcht maar het wil niet echt lukken, naja wel deels.

ik wil een querie/Join uitvoeren
heb een tabel met nummers die nummers hebben een status.
en een gebruiker tabel die die nummers gebruiken.

ik heb dus wel een querie van alle nummers die op een bepaalde status staan, die goed werkt.
nu wil ik daar aan toevoegen de status van de gebruiker ingelogd/uitgelogd.

code:
1
select sn from tabelsn where status='4'


en ik heb

code:
1
select id,ingelogd from gebruiker


deze wil ik dus combineren nu heb ik dit ik krijg het gewenste resultaat wel
maar elk nummer zie ik dus 20 keer in de result met onderstaande code.
code:
1
2
3
4
select tabelsn.sn, gebruiker.ingelogd
from tabelsn, gebruiker
where tabelsn.sn = gebruiker.ingelogd and tabelsn.status ='4' 
order by ingelogd


kan iemand me een handje helpen?
grtz
Je krijgt met dit commando de status 4 van alle gebruikers. Ik weet niet wat er precies in het veld 'ingelogd' staat, maar als je ook gebruikers.id opneemt zul je zien dat er verschillende waarden terugkomen.
Wil je maar 1 waarde zien, dan zul je een distinct toe moeten voegen in je select

code:
1
2
3
4
select tabelsn.sn, distinct(gebruiker.ingelogd)
from tabelsn, gebruiker
where tabelsn.sn = gebruiker.ingelogd and tabelsn.status ='4' 
order by ingelogd


succes,
Cornelis

  • azuidhof
  • Registratie: April 2005
  • Laatst online: 07-01-2022
canth1 schreef op donderdag 05 oktober 2006 @ 11:39:
[...]
Wil je maar 1 waarde zien, dan zul je een distinct toe moeten voegen in je select
]houd er rekening mee dat in het algemeen DISTINCT niet de manier is om tot een resultaat van 1 rij te komen. Als je op die manier een query bouwt zit het probleem zeer waarschijnlijk in een ander gedeelte van de query (de JOIN/ORDER BY/GROUP BY/WHERE clause niet goed is opgebouwd, geen goede subselect o.i.d.)

Mijn .NET blog!


  • JJvG
  • Registratie: Juli 2003
  • Laatst online: 02-12-2025
Verwijderd schreef op donderdag 05 oktober 2006 @ 11:24:
code:
1
2
3
4
select tabelsn.sn, gebruiker.ingelogd
from tabelsn, gebruiker
where tabelsn.sn = gebruiker.ingelogd and tabelsn.status ='4' 
order by ingelogd


kan iemand me een handje helpen?
grtz
Je SELECT statement geeft als het goed is twee keer dezelfde waarde uit een andere kolom terug. In je WHERE statement zeg je namelijk tabelsn.sn = gebruiker.ingelogd. Volgens mij kun je dan ook volstaan met
SQL:
1
2
3
SELECT sn
FROM tabelsn
WHERE status ='4'

Wil je uitgebreidere user-informatie dan kun je ook nog kijken naar subquery's:
SQL:
1
2
3
4
5
6
7
SELECT *
FROM gebruiker
WHERE gebruiker.ingelogd IN (
     SELECT sn
     FROM tabelsn
     WHERE status ='4'
)


Succes

Verwijderd

Topicstarter
[b][message=26605204,noline]azuidhof schreef op donderdag 05 oktober 2006 @
Geef es een beschrijving van de tabelstructuur want ik kan hier nog niet zo wijs uit (een SELECT op tabelsn.sn, gebruiker.ingelogd bijv. terwijl je ook die 2 velden aan elkaar gelijk stelt met WHERE :? )
dat gelijk stellen slaat nergens op indd, hebk al weggehaald, hoe komt het nu dat ik alle gegevens in TIG voud krijg?
ik snap er nog niet veel van zal me er nog eens verder in gaan verdiepen, bedankt voor de moeite.

Verwijderd

Topicstarter
JJvG schreef op donderdag 05 oktober 2006 @ 11:47:
[...]


Je SELECT statement geeft als het goed is twee keer dezelfde waarde uit een andere kolom terug. In je WHERE statement zeg je namelijk tabelsn.sn = gebruiker.ingelogd. Volgens mij kun je dan ook volstaan met
SQL:
1
2
3
SELECT sn
FROM tabelsn
WHERE status ='4'


Wil je uitgebreidere user-informatie dan kun je ook nog kijken naar subquery's:
SQL:
1
2
3
4
5
6
7
SELECT *
FROM gebruiker
WHERE gebruiker.ingelogd IN (
     SELECT sn
     FROM tabelsn
     WHERE status ='4'
)


Succes
Thx, maar die 1e code heb ik uiteraard al.. de 2e code worden alleen de gebruikers die ingelogd zijn weergegeven.

ik heb nu een code voor de serienummers die een status 4 hebben, waar ook de user bij staat...
nu wil ik ook dat er bij staat of hij ingelogd is of niet. dus vanuit het gebruiker tabel.

[ Voor 11% gewijzigd door Verwijderd op 05-10-2006 12:21 ]


  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 09-02 23:48

Bl4ckviper

BlaBlaBla

Wat wil je nou aan elkaar gelijk stellen?
De status = ''4'' of de gebruikers_id?

Je verhaal is niet echt duidelijk... misschien dat je even kan uitleggen wat je precies bedoelt en wilt.

[ Voor 39% gewijzigd door Bl4ckviper op 05-10-2006 13:00 ]

Be fast .... Be furious....


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:29
Verwijderd schreef op donderdag 05 oktober 2006 @ 11:58:
[...]


dat gelijk stellen slaat nergens op indd, hebk al weggehaald, hoe komt het nu dat ik alle gegevens in TIG voud krijg?
ik snap er nog niet veel van zal me er nog eens verder in gaan verdiepen, bedankt voor de moeite.
Als je niet specifieert op welke velden er moet gejoined worden, krijg je een cartesiaans product (alle rows van tabel A x alle rows van tabel B).

Jij hebt dus 2 tabellen; welk veld is de foreign key in tabel B, en welk veld is de foreign key in tabel A ?
Stel bv:
tabelA: (id, naam)
tabelB: (id, id_vantabelA, bliep)

dan doe je :
code:
1
2
select * from tabelA, tabelB
where tabelA.id = tabelB.id_vantabelA

of
code:
1
2
select * from tabelA
INNER JOIN tabelB ON tabelA.id = tabelB.id_vantabelA

https://fgheysels.github.io/


  • Dido
  • Registratie: Maart 2002
  • Nu online

Dido

heforshe

Verwijderd schreef op donderdag 05 oktober 2006 @ 11:58:
dat gelijk stellen slaat nergens op indd, hebk al weggehaald, hoe komt het nu dat ik alle gegevens in TIG voud krijg?
Laten we stellen dat je twee tabellen hebt, een met voornamen, 1 met achternamen. Beiden hebben ze een unieke sleutel die een persoon definieert.

Ik heb twee personen: Jan Jansen en Piet Pietersen. Die ga ik invoeren in mijn tabellen:

tbl_Voor
1 Jan
2 Piet

tbl_Achter
1 Jansen
2 Pietersen

So far, so good.

Nu wil ik een lijstje van alle personen in mijn database.

Wat jij nu doet is dit:
code:
1
SELECT * from tbl_Voor, tbl_Achter

Resultaat:
code:
1
2
3
4
1 Jan 1 Jansen
1 Jan 2 Pietersen
2 Piet 1 Jansen
2 Piet 2 Pietersen

Dit heet een Cartesisch product. Zolang je geen beperkingen opgeeft middels een WHERE, is er geen reden waarom je niet al deze records terugkrijgt.

Als je goed kijkt naar het resultaat zie je dat wat je eigenlijk wilt, alle records zijn waar de persoonsid's gelijk zijn! De query wordt dan dus:
code:
1
SELECT * from tbl_Voor, tbl_Achter WHERE voor_id = achter_id

Resultaat:
code:
1
2
1 Jan 1 Jansen
2 Piet 2 Pietersen


Je bereikt hetzelfde met
code:
1
SELECT * from tbl_Voor INNER JOIN tbl_Achter ON voor_id = achter_id

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Ej bedankt allemaal
Snap het eindelijk. Ik heb die user ID uit tabelsn gekoppelt aan user ID in gebruiker.
Nu komt alles netjes 1 keer ja

ik heb dus nu:
code:
1
2
3
select tabelsn.sn, tabelsn.userid, gebruiker.ingelogd  (en nog een hoop regels)
from tabelsn, gebruiker
where tabelsn.userid = gebruiker.userid and tabelsn.status ='4'


Nogmaals bedankt :)
soz het was vrij simpel :X
grtz

  • EfBe
  • Registratie: Januari 2000
  • Niet online
from tabelsn, gebruiker
Ik weet dat het bovenstaande minder typen is, maar leer jezelf aan de join gewoon uit te schrijven, dus ookal is dit ook erkend ansi, gebruik toch de volledige join syntaxis met ON clauses. Dit is nl. overzichtelijker want je ziet waarover je joint (welke fields)

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


Verwijderd

Topicstarter
klopt heb de INNER JOIN ON versie ook getest
en laat hem zo ook staan
bedankt _/-\o_
Pagina: 1