PostgreSQL обладает аналогичной функциональностью. Синтаксические отличия незначительны и состоят в замене CROSS APPLY на CROSS JOIN LATERAL. Сравните три примера, которые рассматривались на предыдущих страницах этой главы.
Пример 1
SQL Server
Консоль
Выполнить
SELECT *
FROM laptop L1
CROSSAPPLY
(SELECTMAX(price) max_price, MIN(price) min_price FROM Laptop L2
JOIN Product P1 ON L2.model=P1.model
WHERE maker = (SELECT maker FROM Product P2 WHERE P2.model= L1.model)) X;
Дополнительное отличие в этом примере связано не с реализацией CROSS APPLY, а с тем, что для ограничения выборки PostgreSQL вместо конструкции TOP(n) использеут LIMIT n в предложении ORDER BY.
SELECT * FROM laptop L1
CROSSJOIN LATERAL
(SELECT * FROM Laptop L2
WHERE L1.model < L2.model OR(L1.model = L2.model AND L1.code < L2.code)
ORDERBY model, code LIMIT1) X
ORDERBY L1.model;
OUTER APPLY
Для данного "внешнего" соединения в PostgreSQL используется LEFT JOIN LATERAL. Сравните запросы в примере 4.
Пример 4
SQL Server
Консоль
Выполнить
SELECT * FROM laptop L1
OUTERAPPLY
(SELECTTOP1 *
FROM Laptop L2
WHERE L1.model < L2.model OR(L1.model = L2.model AND L1.code < L2.code)
Обратите внимание на предикат ON TRUE. Поскольку синтаксис соединения [LEFT|RIGHT [OUTER]] JOIN требует предиката, то для единообразия используется "фиктивный" предикат, имеющий значение ИСТИНА.
SELECT * FROM laptop L1
LEFTJOIN LATERAL
(SELECT *
FROM Laptop L2
WHERE L1.model < L2.model OR(L1.model = L2.model AND L1.code < L2.code)