Weitere Beispiele zu Lateral (andere Dialekte), funktioniert auch in DB2 for i:
https://blog.jooq.org/lateral-is-you...iables-in-sql/
Beispiel aus dem Link:
Code:
SELECT
actor_id,
name
, name_length,
COUNT
(*)
FROM
actor
JOIN
film_actor
AS
fa USING (actor_id),
LATERAL (
SELECT
first_name ||
' '
|| last_name
AS
name
)
AS
t1,
LATERAL (
SELECT
length(
name
)
AS
name_length)
AS
t2
GROUP
BY
actor_id,
name
, name_length
ORDER
BY
COUNT
(*)
DESC
LIMIT 5;
In DB2 for i
Code:
SELECT
actor_id,
name
, name_length,
COUNT
(*)
FROM
actor
JOIN
film_actor
AS
fa USING (actor_id),
LATERAL (values(
first_name ||
' '
|| last_name)
)
AS
t1 (name),
LATERAL (values
( length(
name
))
)
AS
t2 (
name_length)
GROUP
BY
actor_id,
name
, name_length
ORDER
BY
COUNT
(*)
DESC
LIMIT 5;
Interessant wirds dann bei Embedded SQL und Parametern:
Code:
select a.*
,a.Preis * Faktor
from Artikel a
cross join lateral(
values( :P1, :P2)
) p (Artikelnummer, Faktor)
where a.Artikelnummer = p.Artikelnummer
Vor allem, wenn man Parameter mehrfach in unterschiedlichen Teilen des SQL's benötigt, braucht man Parameter nur noch 1x per Lateral anhängen, da sie dann überall verwendet werden können. Somit ist die Wartung komplexer SQL's einfacher, wobei die Komplexität sogar noch sinkt.
Lateral wird im Gegensatz zum normalen Join für den Einzelzugriff optimiert und entspricht eher dem Programmiergedanken mit den Dateien.
Übrigens wurde Lateral mit SQL99 bereits eingeführt:
https://elephantdolphin.blogspot.com...ved-table.html
Und für die IBM kam es etwas später:
https://www.rpgpgm.com/2021/10/using...al-in-sql.html
Hier kann man auch schön sehen, dass ein Cross-Join durchaus Sinn macht.
Probierts einfach aus, es ist wirklich genial!
Bookmarks