Hallo, ik ben nieuw hier. Ik heb een vraag over joins en het vertalen van nulls.

Ik heb een SQL statement die relatief gezien eenvoudig is. Maar ik krijg het niet goed voor elkaar.

Het gaat erom dat ik op zoek ben naar een SQL statement volgens deze informatie.

De klant is gebaseerd op een match tussen conracten van tabel A en tabel B. Als er een match is, dan wordt de klant uit tabel A gepakt. Als er geen contract is in tabel B, dan wordt het 00000. Maar als de klant in A geen contract heeft, dan moet het 99999 worden.

SELECT
A.KLANT
FROM TABEL A
LEFT OUTER JOIN TABEL B
ON A.ORDER = B.ORDER

Dat is een normale left outer join statement.
Maar als er geen match is, dus A.KLANT gaat null worden. Dan moet dit 00000 worden.

Los ik zo op
SELECT
COALESCE(A.KLANT, '00000') AS KLANT
FROM TABEL A
LEFT OUTER JOIN TABEL B
ON A.ORDER = B.ORDER

Maar als deze klant in tabel A geen contract heeft, dan moet het 99999 worden.

Hoe los ik zoiets op?

Wim
>> Maar als er geen match is, dus A.KLANT gaat null worden. Dan moet dit 00000 worden.

Je maakt er dan klantnummer 00000 van, maar je wilt juist de speciale status van NULL uitbuiten: NULL duidt op een klant zonder orders of een order zonder klant. Je mist een WHERE met IS NULL of IS NOT NULL.
Waarschijnlijk zoek je een full join, alleen MySQL heeft dat niet, dus moet je dat simuleren:

SELECT
	COALESCE(B.KLANT, '00000') klantnr
FROM
	A
LEFT JOIN
	B
	ON A.ORDER = B.ORDER

UNION /* [DISTINCT] */

SELECT
	COALESCE(A.KLANT, '99999')
FROM
	B
LEFT JOIN
	A
	ON A.ORDER = B.ORDER
Hoe verschillen tabel A en B van elkaar?

Als deze praktisch hetzelfde zijn kun je mogelijk beter een property contracttype introduceren en de tabellen samenvoegen.

Als deze heel erg verschillen ben je toch een beetje appels met peren aan het vergelijken.

Bovenstaande oplossingen borduren mogelijk voort op een verkeerde oplossing (database-opzet).
Wat is het verschil tussen de als en de maar in jouw tabellen: "Als er geen contract is in tabel B, dan wordt het 00000. Maar als de klant in A geen contract heeft, dan moet het 99999 worden".
Wat is geen contract? Geen record of een veld met contract niet gevuld?

Reageren