[sql] dubbele inner join?

Pagina: 1
Acties:

  • Bzzje
  • Registratie: November 2000
  • Laatst online: 23-05 13:39

Bzzje

Negeren is vooruitzien

Topicstarter
Ik heb een SQL statement om uit 2 tabellen wat gegevens te halen.
Het punt is alleen dat ik uit de 2e tabel twee keer gegevens wil halen.
1x de indicator en 1x het mailadres.
Om de een of andere reden heeft iemand dat in hetzelfde veld gezet: contsupref

De onderstaande statement werkt (1x uit de 2e tabel joinen)
code:
1
2
3
4
5
6
7
8
SELECT 
Contact1.COMPANY, Contact1.CONTACT, ContSupp.CONTSUPREF as indicator

FROM Contact1 
INNER JOIN ContSupp ON Contact1.ACCOUNTNO = ContSupp.ACCOUNTNO 
WHERE contsupref like 'VNL-%' 

order by company"


Als ik nu de 2e keer wil joinen, dan pakt hij het niet

code:
1
inner join Contsupp on contact1.accountno = contsupp.accountno where contsupref like "%@%"


Wat ik er dus uiteindelijk uit wil is:

code:
1
2
3
4
5
6
gegevens  | contsupref(indicator)  | contsupref(mail)
_____________________________________________________
contact1  | vnl-1                  | a@b.com
contact1  | vnl-2                  | a@b.com
contact4  | vnl-1                  | b@c.com
contact5  | vnl-9                  | d@d.com


Is dit uberhaupt wel mogelijk?

Negeren is vooruitzien


Verwijderd

Waarom zo moeilijk, kan het niet gewoon zo:

code:
1
2
3
4
5
6
7
8
SELECT 
Contact1.COMPANY, Contact1.CONTACT, ContSupp.CONTSUPREF as indicator

FROM Contact1 
INNER JOIN ContSupp ON Contact1.ACCOUNTNO = ContSupp.ACCOUNTNO 
WHERE contsupref like 'VNL-%' and contsupref like "%@%" 

order by company"


eh, ik bekijke het nog eens en zie dat dat niet werkt in dit geval.. momentje, maak even iets wat wel werkt.

[ Voor 93% gewijzigd door Verwijderd op 08-07-2004 16:31 ]


  • Bzzje
  • Registratie: November 2000
  • Laatst online: 23-05 13:39

Bzzje

Negeren is vooruitzien

Topicstarter
omdat de "and" dan uitgaat van het feit dat in 1 regel contsupref EN "VNL-" bevat EN "@"

edit: je zag het zelf al

[ Voor 30% gewijzigd door Bzzje op 08-07-2004 16:27 ]

Negeren is vooruitzien


Verwijderd

dit dan?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
select
  contact1.company, 
  contact1.contact, 
  contsupp1.contsupref as indicator, 
  contsupp2.contsupref as mail
from
  contact1,
  contsupp contsupp1,
  contsupp contsupp2
where
  contsupp1.accountno=contact1.accountno and
  contsupp2.accountno=contact1.accountno and
  contsupp1.contsupref like 'VNL-%' and
  contsupp2.contsupref like "%@%"

  • Bzzje
  • Registratie: November 2000
  • Laatst online: 23-05 13:39

Bzzje

Negeren is vooruitzien

Topicstarter
dat lijkt hem te zijn

ik wist niet dat je getallen achter de tabelnaam kon plakken.

THANX!!!

Negeren is vooruitzien


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 13:32
Bzzje schreef op 08 juli 2004 @ 16:33:
dat lijkt hem te zijn
ik wist niet dat je getallen achter de tabelnaam kon plakken.
THANX!!!
Ze noemen dit aliassen, een alternatieve naam voor iets. Het mogen ook andere zaken dan nummers zijn overigens.

  • Bzzje
  • Registratie: November 2000
  • Laatst online: 23-05 13:39

Bzzje

Negeren is vooruitzien

Topicstarter
nu alleen nog even uitvogelen hoe in VB(a) het apenstaartje goed gepakt wordt (de % vervangen door een * helpt dan al een hoop)

Negeren is vooruitzien


  • Bzzje
  • Registratie: November 2000
  • Laatst online: 23-05 13:39

Bzzje

Negeren is vooruitzien

Topicstarter
Een iets ander probleem, maar een vervolg op dit, dus ik ga nog even door:

De onderstaande code werkt prima (waarvoor dank aan de generaal)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
select
  contact1.company, 
  contact1.contact, 
  contsupp1.contsupref as indicator, 
  contsupp2.contsupref as mail
from
  contact1,
  contsupp contsupp1,
  contsupp contsupp2
where
  contsupp1.accountno=contact1.accountno and
  contsupp2.accountno=contact1.accountno and
  contsupp1.contsupref like 'VNL-%' and
  contsupp2.zip like '_1%' and
  contsupp2.contsupref like "%@%"


Maaaar.... nu blijkt nog een extra moeilijkheid te zijn.
er is in een veld (zip) aangegeven of het bijgehouden mailadres het primaire mailadres is een overig mailadres. (and contsupp2.zip like '_1%' = primair, like '_0%' is overig)

Nu komt het helaas voor dat een gebruiker van een contactpersoon het primaire mailadres heeft verwijderd. Dit heeft (logischerwijs) niet automatisch het gevolg dat een ander adres het primaire mailadres wordt.

Dit klinkt allemaal prima als misbruik van velden en onprettig omspringen met een database, maar mensen die goldmine kennen zal dit wel bekend voorkomen ;)

wat er dan dus nog bij zou moeten komen is het secundaire mailadres voor diegenen die geen primair mailadres hebben.

Ik heb al union geprobeerd met precies bovenstaande code als union met het verschil dat contsupp2.zip like '_0%'.
Union pakt namelijk niet de mensen die al voorkomen in het bovenste stuk.
Zodra ik dit echter uitvoer, klapt de app er uit omdat hij het te moeilijk vindt worden (er zit namelijk nog wat meer in het select stuk dat geen verdere where-clausules heeft)

[ Voor 3% gewijzigd door Bzzje op 09-07-2004 16:33 ]

Negeren is vooruitzien


Verwijderd

Bzzje schreef op 09 juli 2004 @ 16:33:
Ik heb al union geprobeerd met precies bovenstaande code als union met het verschil dat contsupp2.zip like '_0%'.
Union pakt namelijk niet de mensen die al voorkomen in het bovenste stuk.
Zodra ik dit echter uitvoer, klapt de app er uit omdat hij het te moeilijk vindt worden (er zit namelijk nog wat meer in het select stuk dat geen verdere where-clausules heeft)
Tsja, zonder dat te zien kan ik er niet echt een uitspraak over doen.. bij een union moeten de velden overeenkomen qua hoeveelheid, naam, volgorde en type, ik neem aan dat dat wel het geval is?

Gezien je omschrijving ben ik bang dat je al snel op een subquery uitkomt, zeg maar zoiets (extreem smerig imo)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
select
  contact1.company, 
  contact1.contact, 
  contsupp1.contsupref as indicator, 
  contsupp2.contsupref as mail
from
  contact1,
  contsupp contsupp1,
  contsupp contsupp2
where
  contsupp1.accountno=contact1.accountno and
  contsupp2.accountno=contact1.accountno and
  contsupp1.contsupref like 'VNL-%' and
  contsupp2.zip like '_1%' and
  contsupp2.contsupref like "%@%" and 
  not  contsupp2.id in 
     (select id from contsupref where zip like " _1%")

union all

select
  contact1.company, 
  contact1.contact, 
  contsupp1.contsupref as indicator, 
  contsupp2.contsupref as mail
from
  contact1,
  contsupp contsupp1,
  contsupp contsupp2
where
  contsupp1.accountno=contact1.accountno and
  contsupp2.accountno=contact1.accountno and
  contsupp1.contsupref like 'VNL-%' and
  contsupp2.zip like '_1%' and
  contsupp2.contsupref like "%@%" and 
  contsupp2.id in 
     (select id from contsupref where zip like " _1%")


Ik ben er hierbij even vanuit gegaan dati die contsupp tabel een id veld heeft.

  • pling
  • Registratie: Maart 2001
  • Laatst online: 30-03 21:07

pling

Lekker Kepjoeteren

Met de inner-join syntax doe je dat zo
code:
1
2
INNER JOIN ContSupp C1 ON Contact1.ACCOUNTNO = C1.ACCOUNTNO 
INNER JOIN ContSupp C2 ON Contact1.ACCOUNTNO = C2.ACCOUNTNO

Verwijderd

pling schreef op 09 juli 2004 @ 23:15:
Met de inner-join syntax doe je dat zo
code:
1
2
INNER JOIN ContSupp C1 ON Contact1.ACCOUNTNO = C1.ACCOUNTNO 
INNER JOIN ContSupp C2 ON Contact1.ACCOUNTNO = C2.ACCOUNTNO
Klopt, maar dat is niet echt het antwoord op de huidige vraag.

Overigens is wat ik doe ook een inner join hoor, alleen ik vind zelf deze notatie een stuk prettiger lezen. Zelfs een halve zool kan zien wat er bij deze notatie gebeurd, en dat is bij de 'inner join' notatie domweg niet zo. (imo)

  • pling
  • Registratie: Maart 2001
  • Laatst online: 30-03 21:07

pling

Lekker Kepjoeteren

(Ik wilde slechts aangegeven dat het ook met die syntax mogelijk is) zo, dan:
code:
1
2
INNER JOIN ContSupp C1 ON Contact1.ACCOUNTNO = C1.ACCOUNTNO AND contsupref like "%@%"
INNER JOIN ContSupp C2 ON Contact1.ACCOUNTNO = C2.ACCOUNTNO AND contsupref like 'VNL-%'

  • Bzzje
  • Registratie: November 2000
  • Laatst online: 23-05 13:39

Bzzje

Negeren is vooruitzien

Topicstarter
Verwijderd schreef op 09 juli 2004 @ 16:55:

Ik ben er hierbij even vanuit gegaan dati die contsupp tabel een id veld heeft.
yep, accountno

ondanks dat je contsupp en contsupref door mekaar haalt in je voorbeeld, denk ik dat ik daar wel een stuk verder mee kom.

de union klapte niet vanwege verkeerde statement, maar hoogstwaarschijnlijk omdat hij het gewoon te moeilijk vond. goldmine is niet zo'n proffessionele sql-parser

Negeren is vooruitzien


  • Vaudtje
  • Registratie: April 2002
  • Niet online
Bzzje schreef op 08 juli 2004 @ 17:20:
nu alleen nog even uitvogelen hoe in VB(a) het apenstaartje goed gepakt wordt (de % vervangen door een * helpt dan al een hoop)
Dit lijkt erop te wijzen dat je geen parameterized queries gebruikt. Foei! Kijk hier

In deeze zin staan drie fauten

Pagina: 1