Hulp nodig SELECT query
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.
Gewijzigd op 13/09/2012 14:52:12 door Marco ----
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. ...
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.
Gewijzigd op 13/09/2012 15:03:29 door Kris Peeters
Ook een right join heb ik geprobeerd
Toevoeging op 13/09/2012 15:22:37:
Iemand?
Gewijzigd op 13/09/2012 15:05:13 door Marco ----
Oplossing de eerste inner join in een subquery zetten en dan laten volgen de left join:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
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
Te snel op de knop gedrukt
Gewijzigd op 13/09/2012 16:46:40 door Ger van Steenderen