[SQL] alleen eerste resultaat Left join

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • snader2
  • Registratie: Juni 2008
  • Laatst online: 13:56
Misschien een simpel vraagje maar kom er niet lekker uit. Heb even simpel gezegd 2 tabellen die ik via een left join aan elkaar koppel. Nu is alleen het punt dat de 2e tabel meerdere keren de unieke waarde van tabel 1 bevat waarmee ik ze koppel. Hoe kan ik zorgen dat SQL alleen de eerste match pakt.
voorbeeld:
tabel1:
idnaam
1naam1
2naam2

tabel2:
idnaamt2
1naamt21
1naamt22
1naamt23
2naamt24
2naamt25

Dan word mijn output dus 6 regels met daarin 3x nummer 1 2x nummer 2 en een keer nummer 3. Maar ik wil 1x nummer 1 1x nummer 2 en 1x nummer 3. Dus naamt22, naamt23,naamt25 mogen wegvallen.

[ Voor 4% gewijzigd door snader2 op 06-05-2009 22:24 ]


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 18:33

Dido

heforshe

Dan zul je eerst de vraag moeten beantwoorden: welke records wil je zien?
Je zegt dat naamt22 en naamt23 weg mag, maar waarom wil je specifiek naamt21 wel zien? Is het het oudste record, het nieuwste? SQL is niet echt goed in random een record laten zien, je zult precies moeten weten wat je wilt :)

Als naamt2 helemaal niet uitmaakt, kun je het veld wellicht gewoon uit je select weglaten ;)

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 07-09 13:37
[b][message=31907479,noline]meerdere keren de unieke waarde
Dat moet je toch eens uitleggen, meerdere keren de unique waarde ? Dan is er toch niks unieks aan ?

Acties:
  • 0 Henk 'm!

  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 19-09 23:45
Ben weliswaar net begonnen, en misschien een stomme oplossing, heb zo'n vermoeden van wel, maar toch.

Probeer eens een NATURAL JOIN, hele pagina zelf is ook wel handig. ;)

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


Acties:
  • 0 Henk 'm!

  • snader2
  • Registratie: Juni 2008
  • Laatst online: 13:56
@dido: het maakt mij niet uit aangezien naamt21, naamt22, naamt23 allemaal hetzelfde zijn dus wat het makkelijkste is, bijvoorbeeld de eerste die hij tegenkomt. Maar ik moet er wel een van de 3 hebben.
@fleppuhstein: sorry even verbeterd, het is een unieke waarde in tabel 1 in tabel 2 inderdaad niet.

[ Voor 7% gewijzigd door snader2 op 06-05-2009 22:29 ]


Acties:
  • 0 Henk 'm!

  • jbdeiman
  • Registratie: September 2008
  • Nu online
Probeer eens een GROUP BY tabel2.id te doen.

Acties:
  • 0 Henk 'm!

  • snader2
  • Registratie: Juni 2008
  • Laatst online: 13:56
@jbdeiman: als ik achteraan de sql function (met left joins) dat toevoeg krijg ik een error dat er ergens iets fout is.
@Xanland: ook hier krijg ik een error
sorry dat ik geen duidelijke error kan geven maar die krijg ik niet.

Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
Lees de reactie van Dido nog eens:
SQL is niet echt goed in random een record laten zien, je zult precies moeten weten wat je wilt
Een group by op table2.id zou in mysql misschien wel werken, maar is hier absoluut niet voor bedoeld. :)

You don't have to be crazy to do this job, but it helps ....


Acties:
  • 0 Henk 'm!

  • Fiander
  • Registratie: Februari 2001
  • Laatst online: 28-05 12:35
Zou je nog een keer kunnen uitleggen ( liefst met realworld data ) hoe de data van tabel 2 er uitziet ?

Het ene moment zeg je dat voor ID 2 er drie verschillende waardes voor de naam kunnen zijn,
terwijl je net later
het maakt mij niet uit aangezien naamt21, naamt22, naamt23 allemaal hetzelfde zijn
zegt

Als dat laatste waar is, zou je er met een distinct zijn.

Deze sig is een manueel virus!! Als je dit leest heb je het. Mail dit bericht naar iedereen die je kent, en verwijder alle bestanden van je computer.


Acties:
  • 0 Henk 'm!

  • snader2
  • Registratie: Juni 2008
  • Laatst online: 13:56
Sorry voor de verwarring. Ik heb een DISTINCT erin gezet maar nu blijkt toch dat naamt21 soms ongelijk is aan naamt22 enzovoort..
Om het duidelijker te maken: hoe krijg ik alleen naamt21 en naamt24 terug. Dus alleen de eerste resultaten.

edit: 8)7 Waarom moeilijk doen met sql als ik ook gewoon met excel mijn resultaat kan filteren.....sorry voor het storen.

[ Voor 20% gewijzigd door snader2 op 06-05-2009 23:00 ]


Acties:
  • 0 Henk 'm!

  • RikTW
  • Registratie: Januari 2004
  • Laatst online: 07:21
Ik hoop dat ik de velden nu allemaal de juiste naam heb gegeven, maar dit zou denk ik moeten werken:
code:
1
SELECT Table1.ID, MAX(Table2.naam2) FROM Table1 LEFT JOIN Table2 ON Table1.ID = Table2.ID2 GROUP BY Table1.ID


Edit: ik heb hier max gebruikt, maar je zou ook een andere functie kunnen gebruiken om de dubbele resultaten uit tabel2 samen te vatten.

[ Voor 24% gewijzigd door RikTW op 06-05-2009 23:02 ]


Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
snader2 schreef op woensdag 06 mei 2009 @ 22:58:
Om het duidelijker te maken: hoe krijg ik alleen naamt21 en naamt24 terug. Dus alleen de eerste resultaten.
Een database tabel is een relatie. In een relatie bestaat geen volgorde. Wil je het resultaat dat als eerst toegevoegd is aan de database? Wil je het eerste resultaat geordend op naam of volgnummer of iets anders?

You don't have to be crazy to do this job, but it helps ....


Acties:
  • 0 Henk 'm!

Verwijderd

op het moment dat naamt21, naamt22 enz altijd dezelfde waarden hebben dan kun je gebruik maken van distinct. distinct houdt in dat alle combinaties in de select maar 1 keer voorkomen in het resultaat.
dus devolgende query geeft dan het gewenste resultaat:
code:
1
SELECT DISTINCT Table1.ID, Table2.Naam FROM Table1.ID = Table2.ID


Let wel als de waarde van Table1.ID in Table2 meerdere malen voorkomt met een verschillende waarden als Table2.Naam dan krijg je nog steeds meer resultaten met Table1.ID aangezien de combinaties dan anders zijn

[ Voor 23% gewijzigd door Verwijderd op 09-05-2009 18:02 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op zaterdag 09 mei 2009 @ 18:01:
Let wel als de waarde van Table1.ID in Table2 meerdere malen voorkomt met een verschillende waarden als Table2.Naam dan krijg je nog steeds meer resultaten met Table1.ID aangezien de combinaties dan anders zijn
Heb je de topicstart überhaupt gelezen, want die situatie staat daar toch ook precies uitgelegd? Jouw query gaat dus zeker niet werken. ;)

De query van RikTW hierboven overigens wel - mits je MAX() door MIN() vervangt ;) - maar ik hoop voor de topicstarter dat hij eerst even Programming FAQ - SQL: Hoe werkt dat GROUP BY nu eigenlijk? doorleest voordat hij hem zomaar overneemt. Iets dat je niet kent klakkeloos overnemen is in elk geval een slecht plan. :)

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


Acties:
  • 0 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
of the good ol'

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
select id
,      naam2
from
(
    select table1.id
    ,      table2.naam2
    ,      @num := if(@naam2 = table2.naam2, @num + 1, 1) as row_number
    ,      @naam2 := table2.naam2 as dummy
    from      table1 
    left join table2 on table1.id = table2.id2
    order by [.. bepaal hier zelf waarop je sorteert ipv de waarde van naam2 ..]
)
where row_number = 1


Maar ja, dit is redelijk gevorderde sql I guess

Acties:
  • 0 Henk 'm!

  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

Zonder JOIN:

code:
1
select ID, (select top 1 naamt2 from TABEL2 where id = T1.id) from TABEL1 T1


Wel een rare DB-structuur als je't mij vraag.

[ Voor 25% gewijzigd door Coltrui op 12-05-2009 09:27 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
top, MIN(), MAX(), allemaal een variatie op hetzelfde idee: ts moet gewoon kiezen welk eerste resultaat hij wilt zodat query deterministisch is.

{signature}

Pagina: 1