Hallo allemaal,

Ik ben bezig met het overzetten van gegevens van één database naar een andere bestaande database. Daarvoor wil ik een aantal gegevens samenvoegen:

tabel artikel (prijs)
tabel artikelinfo (alle gegevens)
tabel artikelinfodetail (alle gegevens)

Met onderstaande query heb ik alvast de artikelen aan een prijs gekoppeld:

SELECT
artikelinfo.nr,
COUNT(artikelinfo.nr) AS aantal,
artikelen.huurprijsexbtw
FROM
artikelen,
artikelinfo
WHERE
artikelinfo.nr = artikelen.artikelnummer
GROUP BY
artikelinfo.nr
HAVING
aantal < 2

Bovenstaande query resulteert in 1625 rijen.

Vervolgens heb ik geprobeerd met onderstaande query ook nog alle gegevens uit artikelinfodetail op wil halen krijg ik veel minder rijen, namelijk iets meer dan 900. Dit zou hetzelfde aantal (1625) moeten zijn.

SELECT
artikelinfo.nr,
COUNT(artikelinfo.nr) AS aantal,
artikelen.huurprijsexbtw,
artikelinfodetail.*
FROM
artikelen,
artikelinfo
LEFT JOIN artikelinfodetail ON artikelinfo.nr = artikelinfodetail.nr
where
artikelinfo.nr = artikelen.artikelnummer
GROUP BY
artikelinfo.nr
HAVING
aantal < 2

Uit tabel artikelinfo wil ik alle rijen ophalen ongeacht of nr uit de artikelinfodetail bestaat of niet. Als hij daar wel bestaat wil ik de informatie tot één rij samenvoegen. Er staan veel dubbele artikelnummers in. Met de COUNT haal ik alleen de artikelnummers op die één keer voorkomen.

Hopelijk is dit verhaal duidelijk genoeg. Kan iemand mij hiermee helpen?
Alvast bedankt.
Marco ---- op 13/09/2012 14:50:35

...
LEFT JOIN artikelinfodetail ON artikelinfo.nr = artikelinfodetail.nr

... Uit tabel artikelinfo wil ik alle rijen ophalen ongeacht of nr uit de artikelinfodetail bestaat of niet. ...



Dat is nu precies het verschil tussen
LEFT JOIN (= indien artikelinfodetail minstens 1 match vindt),
RIGHT JOIN (= indien artikelinfo minstens 1 match vindt),
INNER JOIN (= enkel indien in beide velden iets steekt),
FULL JOIN (= indien er een (of meer) match is links ofwel rechts)

Meer uitleg:
http://www.w3schools.com/sql/sql_join_inner.asp
De links naar documentatie van de andere joins staan daar ook.
Voor zover ik begrijp geef je met een LEFT JOIN aan dat de linker tabel (artikelinfo) niet aan dezelfde voorwaarde hoeft te voldoen?
Ook een right join heb ik geprobeerd


[size=xsmall]Toevoeging op 13/09/2012 15:22:37:[/size]

Iemand?
Dat komt omdat je eerst impliciet joined, hetgeen altijd en inner join is, en dan laat volgen door een outer join, wat geen enkel effect heeft wat dan is de inner join leidend.
Oplossing de eerste inner join in een subquery zetten en dan laten volgen de left join:

SELECT
	v.nr,
	v.huurex,
	v.aantal,
	ai.*
FROM
	(SELECT
		artikelinfo.nr,
		COUNT(artikelinfo.nr) AS aantal,
		artikelen.huurprijsexbtw AS huurex
	  FROM
		artikelen,
		artikelinfo
	  WHERE
		artikelinfo.nr = artikelen.artikelnummer
	GROUP BY
		artikelinfo.nr
		HAVING
		aantal < 2
	) AS v
LEFT JOIN
	artikelinfodetail AS ai
	ON v.nr = ai.nr

[edit]
Te snel op de knop gedrukt


Reageren