Ich weiß eigentlich nach wie vor nicht, warum Du auf dem LATERAL und verschachtelten Sub-Selects bestehst.
Bei einem CROSS JOIN wird kein LATERAL benötigt.
Also:
Reicht völlig aus!Code:select * from (Select F1, f2, Count(*) Count12 from x Group By F1, F2) Cross Join (Select Count(*) Count0 from x);
(und wenn man das Semi Colon nach dem Sub-Select in Deinem Beispiel weglassen würde, würde sogar Dein Beispiel laufen!)
Auch im zweiten Beispiel ist ein LATERAL (bzw. 4 LATERALs) völlig überflüssig!
Das folgende Beispiel bringt das gleiche Ergebnis völlig OHNE LATERAL
Anstatt der verschachtelten Sub-Selects, die spätestens beim 3 verschachtelten Sub-Select nicht mehr lesbar sicn und auch nicht einzeln getestet werden können, würde ich IMMER Common Table Expressions verwenden.Code:select a.F1, a.F2, Count0, Count1, Count2 from (select f1, f2 from x group by f1, f2) a Cross Join (Select Count(*) as Count0 From x) Left Join (Select F1, Count(*) Count1 From x Group By F1) b on a.F1 = b.F1 Left Join (Select F2, Count(*) Count2 From X Group by F2) c on a.F2 = c.F2;
Damit würde das zweite Beispiel mit den vielen Sub-Selects wie folgt aussehen (auch wieder völlig OHNE Lateral:
Aber warum einfach, wenn's auch kompliziert geht!Code:With a as (Select F1, F2, Count(*) CountF12 From x Group By F1, F2), b as (Select F1, Count(*) Count1 From x Group By F1), c as (Select F2, Count(*) Count2 from x Group By F2), d as (Select Count(*) Count0 From x) Select a.F1, a.F2, Count0, Count1, Count2 from a Left Outer Join b on a.F1 = b.F1 Left Outer join c on a.F2 = c.F2 Cross join d;
![[NEWSboard IBMi Forum]](images/duke/nblogo.gif)



Mit Zitat antworten
Bookmarks