Toon posts:

[SQL] inner join & equijoin

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

Verwijderd

Topicstarter
Als student moet ik hier sql leren, maar ik snap nog steeds niet het verschil tss inner join en equijoin. En aangezien m'n cursus niet echt duidelijkheid hierin brengt, postik dit eens op het forum.


vraag: toon naam van het bedrijf van deklant en voornaam en naam van de werknemer waarvoor de werknemer een bestelling heeft geplaatst.

mijn oplossing :

select orders.orderid, customers.companyname, employees.lastname, employees.firstname
from orders, customers, employees
where (customers.customerid=orders.customerid)
and (employees.employeeid=orders.employeeid)


iemand anders zijn oplossing:

SELECT O.OrderID,C.CompanyName,E.LastName,E.FirstName
FROM Customers C JOIN Orders O
ON (C.CustomerID=O.CustomerID)
JOIN dbo.Employees E
ON(E.EmployeeID=O.EmployeeID

Wat is nu juist het verschil tussen beide oplossingen? Ze geven alle twee het zelfde resultaat.

Alvast bedankt

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Volgens mij is alleen de notatie anders en is het effect hetzelfde.

  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Wat is nu juist het verschil tussen beide oplossingen? Ze geven alle twee het zelfde resultaat.
afaik is er geen verschil in beide methoden. Een equi-join wordt ook wel een inner-join genoemd, en beiden hebben dan ook hetzelfde resultaat.

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


Verwijderd

Topicstarter
hmm, das raar. In de cursus staat er zijn verschillende joins. Wij beperken ons tot equi join en inner join. Er moet toch wel ergens een verschil zijn? Niet?

Greetz

  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

hmm, das raar. In de cursus staat er zijn verschillende joins. Wij beperken ons tot equi join en inner join. Er moet toch wel ergens een verschil zijn? Niet?
Er is wel een groot verschil tussen een inner en een outer join, en ik denk dan ook dat dit is wat ze bedoelen. Ik kan me namelijk niet voorstellen dat ze zich in deze cursus beperken tot deze twee genoemde joins.
edit:

Zie ook:
SQL Join

[ Voor 10% gewijzigd door DeverauX op 09-06-2003 12:04 ]

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


Verwijderd

Topicstarter
Als ik die site bekijk: staat daar : The INNER JOIN returns all rows from both tables where there is a match. If there are rows in Employees that do not have matches in Orders, those rows will not be listed.

Dus bij equijoin zullen die rijen wel getoond worden?

deverauX: die curus is echt beperkt tot de equi en inner :)

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Daar heb je left join voor nodig.
DeverauX: Wat is dan het verschil tussen left join en outer join?

[ Voor 51% gewijzigd door Olaf van der Spek op 09-06-2003 12:13 ]


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Dus bij equijoin zullen die rijen wel getoond worden?
Nee dit is met een outer join het geval ;) :)
deverauX: die curus is echt beperkt tot de equi en inner
|:(

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


Verwijderd

Topicstarter
Dus infeite is het altijd beter dat ik op de verschillende oefeningen altijd de innerjoin ingeef?
?

thx

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Er is _ook_ een verschil tussen inner joins en equi-joins :)

equi-join:
code:
1
SELECT * FROM tabel1, tabel2 WHERE tabel1.kolom = tabel2.kolom


Inner join:
code:
1
2
3
4
5
SELECT * FROM tabel1 NATURAL INNER JOIN  tabel2
of
SELECT * FROM tabel1 INNER JOIN  tabel2 USING (kolom)
of
SELECT * FROM tabel1 INNER JOIN  tabel2 ON (tabel1.kolom = tabel2.kolom)

Ze hebben inderdaad hetzelfde resultaat, echter is de plaats waar ze uitgevoerd worden zeer verschillend en is het mogelijk dat een JOIN een bepaalde optimalisatie voor de database in de weg kan staan of juist een bepaalde variant afdwingt.

De precieze verschillen voor de database-internals zou ik ook niet weten, ik heb het een keer gelezen, maar ben het grootste deel weer vergeten :o

't Zou me echter wel verbazen als ze zich niet bemoeien met outer joins, maar enkel met inner en equi-joins. Met name omdat die laatste eigenlijk nooit bij name genoemd wordt :)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

OlafvdSpek schreef op 09 June 2003 @ 12:11:
Daar heb je left join voor nodig.
DeverauX: Wat is dan het verschil tussen left join en outer join?
Left outer join, is de volledige naam van de left join.

Je hebt daarnaast nog een right outer join en een full outer join.

  • Theguide
  • Registratie: December 2000
  • Laatst online: 26-06-2025
Misschien wel handig om te weten. Er is schijnbaar in MS SQL (en misschien wel in andere DBMS-en) toch een subtiel edoch significant verschil tussen een zogenaamde straight join of natural join (joins met de where clause) en een right/left outer join (joins met keyword JOIN) waardoor je een ander resultaat kunt krijgen als je je query vertaalt van een natural join naar een right/left outer join.

Het verschil wordt hier uitgelegd:
http://www.databasejourna...mssql/article.php/1438001
onder het kopje "Outer Join Gotchas"

[ Voor 2% gewijzigd door Theguide op 10-06-2003 10:36 . Reden: typo ]

Fuck me if I'm wrong, but isn't your name Gretchen?


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Theguide schreef op 10 June 2003 @ 10:35:
een zogenaamde straight join of natural join (joins met de where clause)
Een natural join is toch niks anders dan een inner join, maar dan zonder een ON of USING opdracht :?

Das toch geen join via de where, een equi-join is juist via de where.

Maar verder heb je zeker gelijk, het is echter denk ik iets netter om te zeggen dat er een significant verschil tussen de resultaten van een inner en outer join zit, dan om ze allemaal met name te proberen te noemen :)
Een straight (inner) join, natural (inner) join, (inner) join vs left/right/full (outer) join is al iets meer volledig :o
En dan is de cross join weer een aparte vogel.

De uitleg van drm in de FAQ vind ik ook wel aardig trouwens.

[ Voor 9% gewijzigd door ACM op 10-06-2003 11:01 ]


  • zoepercavia
  • Registratie: September 2001
  • Laatst online: 26-12-2025
Ik weet het niet 100% zeker (maar wel bijna :)) dat het verschil is dat je bij een inner join updates op je recordset kan uitvoeren en dit kan bij een equi-join niet. Een equi-join is dus alleen bruikbaar voor selectie van data, een inner join kan je ook gebruiken als je meerdere tables tegelijk gelinked wilt veranderen.

Panacea.NL als je geinteresserd bent in IT en Geneeskunde!


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 21:48

pistole

Frutter

zoepercavia schreef op 10 juni 2003 @ 11:08:
Ik weet het niet 100% zeker (maar wel bijna :)) dat het verschil is dat je bij een inner join updates op je recordset kan uitvoeren en dit kan bij een equi-join niet. Een equi-join is dus alleen bruikbaar voor selectie van data, een inner join kan je ook gebruiken als je meerdere tables tegelijk gelinked wilt veranderen.
dat kan prima met een equijoin (als je dat op zo'n moment kan noemen); ik doe dat regelmatig
code:
1
2
3
4
5
6
7
8
update
  tabel1
set
  col1=t2.col1
from
  tabel1 t1, tabel t2
where
  t1.coln=t2.coln

ofzo

[ Voor 12% gewijzigd door pistole op 10-06-2003 11:12 ]

Ik frut, dus ik epibreer


  • Theguide
  • Registratie: December 2000
  • Laatst online: 26-06-2025
het is echter denk ik iets netter om te zeggen dat er een significant verschil tussen de resultaten van een inner en outer join zit, dan om ze allemaal met name te proberen te noemen
Dat er een verschil is tussen een inner join en een outer join (hetzij left, dan wel right), dat is natuurlijk een open deur! Dat is niet zo spannend om te vertellen. Als hier geen verschil in zou zitten, dan zou een outer join zowieso geen bestaansrecht hebben.

Een natural join hoeft geen inner join te zijn.
Even een voorbeeldje:

select * from a, b where a.id *= b.id (left join)
select * from a, b where a.id =* b.id (right join)

dit zou gelijk moeten zijn aan:

select * from a left join b on a.id = b.id
select * from a right join b on a.id = b.id

Deze zouden dus exact hetzelfde resultaat moeten geven, echter in dat artikel waar ik naar verwijs, wordt dus melding gegeven van een bepaalde situatie waarbij het resultaat wel degelijk anders is.

Ik hoop dat het nu duidelijker is wat ik bedoel.

[ Voor 13% gewijzigd door Theguide op 10-06-2003 11:18 ]

Fuck me if I'm wrong, but isn't your name Gretchen?


  • zoepercavia
  • Registratie: September 2001
  • Laatst online: 26-12-2025
pistole schreef op 10 June 2003 @ 11:10:
[...]

dat kan prima met een equijoin (als je dat op zo'n moment kan noemen); ik doe dat regelmatig
code:
1
2
3
4
5
6
7
8
update
  tabel1
set
  col1=t2.col1
from
  tabel1 t1, tabel t2
where
  t1.coln=t2.coln

ofzo
Yup, dat wel. Maar als je eerst een SELECT doet en dan later je recordset gaat veranderen (wat natuurlijk niet zo mooi is, maar veel ASP tutorials beginnen bijvoorbeeld wel zo), dan werkt een JOIN wel een een WHERE niet. Wat ik er van begrijp is dat JOIN de link aangeeft tussen tables en WHERE alleen restrictie oplegt.

Overigens staat in het volgende artikel dat een Equijoin heel wat ander is:
An equijoin is an INNER JOIN in which you ask for the join columns from both tables. You may think that this join will return redundant data, and of course, you are correct.

Panacea.NL als je geinteresserd bent in IT en Geneeskunde!


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Theguide schreef op 10 June 2003 @ 11:15:
Een natural join hoeft geen inner join te zijn.
Even een voorbeeldje:

select * from a, b where a.id *= b.id (left join)
select * from a, b where a.id =* b.id (right join)

dit zou gelijk moeten zijn aan:

select * from a left join b on a.id = b.id
select * from a right join b on a.id = b.id
't Zijn toch beide geen natural joins?

Dit is bij mijn weten een natural join:
select * from a natural (left/right/full [outer] | [inner]) join b ...

Dus meer concreet:
select a from a natural left join b
is dan equivalent met jouw
select * from a, b where a.id *= b.id
Deze zouden dus exact hetzelfde resultaat moeten geven, echter in dat artikel waar ik naar verwijs, wordt dus melding gegeven van een bepaalde situatie waarbij het resultaat wel degelijk anders is.

Ik hoop dat het nu duidelijker is wat ik bedoel.
Een query ala:
select * from a left join b on a.id = b.id
vs
select * from a, b where a.id (* )=(* ) b.id
is uiteraard anders... want bij de eerste doe je een normale inner/equijoin en bij de tweede een left/right outer join... Maar ik heb dus een andere definitie van de 'natural join' in mijn hoofd, wellicht dat ik in de war ben met een het keyword 'natural', magoed.

Ik vind dat verschil in voorbeeld ook wel een beetje een open deur trouwens, maar dat zal komen omdat ik er wel eens zelf tegenaan gelopen ben en het sindsdien niet meer fout doe :o
De queries:
select * from a, b where a.id *= b.id and b.id = 5
is namelijk equivalent met:
select * from a left join b on a.id = b.id and b.id = 5
en niet met:
select * from a left join b on a.id = b.id where b.id = 5

de executie van die and is heel anders, in oracle zijn overigens deze weer wel equivalent:
select * from a, b where a.id = b.id (+) and b.id = 5
Althans, oracle 9 kent pas de 'left join' enzo, kwa naamgeving
select * from a left join b on a.id = b.id where b.id = 5

Dat moet je dan herschrijven naar:
select * from a, b where a.id = b.id (+) and b.id = 5 (+)

(de (+) ben ik niet helemaal zeker van, ik meen dat dat de indicatie was dat een bepaalde clause null mag zijn -> left/right join)

[ Voor 4% gewijzigd door ACM op 10-06-2003 11:43 ]


  • Theguide
  • Registratie: December 2000
  • Laatst online: 26-06-2025
Okay, ik doe water bij de wijn: ik drop "natural join" en blijf dan bij "straight join" okay? :)

Fuck me if I'm wrong, but isn't your name Gretchen?


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Deze zouden dus exact hetzelfde resultaat moeten geven, echter in dat artikel waar ik naar verwijs, wordt dus melding gegeven van een bepaalde situatie waarbij het resultaat wel degelijk anders is.
Klopt en die situatie is dat wanneer je in je 1e query een WHERE clausule zou gebruiken zoals bijvoorbeeld:
SQL:
1
where a.id *= b.id and a.id=1 


Het probleem is dat met deze constructie de join deel uitmaakt van je where clausule. SQL server zal eerst alle records zoeken waarvan a.id gelijk is aan 1, en vervolgens van deze records diegene tonen waarvan a.id gelijk is aan b.id.
(zijn er geen records waarvan a.id gelijk is aan 1 dan krijg je dus geen enkel record geretourneerd)
Dit in tegenstelling tot de andere constructie waarbij eerst wordt gekeken waar a.id gelijk is aan b.id en vervolgens pas de where clausule wordt uitgevoerd. ;)

edit:

Te laat...zie ACM voor de betere uitleg :)

[ Voor 4% gewijzigd door DeverauX op 10-06-2003 11:48 ]

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


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

hehe, maar ik weet ook nog steeds niet of ik wel gelijk heb :o

[ Voor 48% gewijzigd door ACM op 10-06-2003 11:51 ]

Pagina: 1