CostCenter leeg?
Het is niet geheel duidelijk of de getoonde join op MySQL (of mogelijk SQL Server?) of Invantive is. Het lukt ook niet goed om te achterhalen wat de rol van “CostCenter/Unit zijn leeg” is; dit komt niet terug in de join, en of het een inner join
, left outer join
, right outer join
of full outer join
is.
Mocht een oplossing gezocht worden voor lege CostCenter/CostUnit waardes die met elkaar moeten matchen als beiden ontbreken:
Onafhankelijk van de SQL-implementatie zal elke SQL-variant zich grotendeels aan de standaarden conformeren. Hierbij geldt dat een null
(leeg) nergens mee overeenkomt, omdat het staat voor “onbekend”. Zelfs “onbekend” is niet gelijk aan “onbekend”; de betekenis van een lege cel kan zelfs meerdere soorten “onbekend” zijn zoals “er is geen waarde”, “de waarde is niet bekend” of “de waarde is wel bekend maar niet bij de gebruiker die het record ingevoerd heeft”.
De join zal bij lege velden terecht geen resultaat geven.
Enkele manieren om “onbekend” (null
) gelijk te stellen aan “onbekend” zijn:
- gebruik
is
operator i.p.v.=
(alleen MySQL voor zover bekend). - gebruik een defaultwaarde zoals
and coalesce(c1, 'niet-bestaande-waarde') = coalesce(c2, 'niet-bestaande-waarde')
- schrijf de
is
-operator uit in SQL zoalsand ( ( c1 is null and c2 is null ) or c1 = c2 )
In het algemeen is een full outer join
aan te bevelen als de combinaties wel overlappen, maar mogelijk beiden waardes buiten de overlap kunnen hebben. Een left outer join
of join
zal anders delen van de gegevens laten verdwijnen. Het zal nodig om deze bij twee tabellen ook te controleren dat de natuurlijke sleutels gelijk zijn; anders is een group by
nodig met een subquery zoals geillustreerd met de volgende query:
select *
from ( select dim1, dim2, sum(val1) from t1 group by dim1, dim2 ) t1c
full
outer
join ( select dim1, dim2, sum(val1) from t2 group by dim1, dim2 ) t2c
on t1c.dim1 = t2c.dim1
...
Zonder tussendatabase: eigen view
Daarnaast is het altijd mogelijk om een eigen view te maken; die wordt dan via OData ook beschikbaar gemaakt. Een view op Invantive SQL kan ook een union
bevatten. Zie verder: