PostgreSQL中Outer Apply的等效语法是什么?

26

我想找到一个将 MSSQL 的 OUTER APPLY 用法转换为 PostgreSQL 的 SQL 查询语句,但似乎很难找到。

我的 MSSQL 示例查询如下。

希望有人能帮我解决这个问题。谢谢提前。

SELECT table1.col1, table1.col2, Supp.ID, Supp.Supplier

FROM SIS_PRS table1 

OUTER APPLY (SELECT TOP 1 ID, SupplierName  FROM table2 WHERE table2.ID = table1.SupplierID) AS Supp
1个回答

40

这是一个侧向连接:

SELECT table1.col1, table1.col2, Supp.ID, Supp.Supplier
FROM SIS_PRS table1 LEFT JOIN LATERAL
     (SELECT ID, SupplierName
      FROM table2
      WHERE table2.ID = table1.SupplierID
      FETCH FIRST 1 ROW ONLY
     ) Supp
     ON true;

然而,您可以通过仅使用相关子查询在任何一个数据库中接近此效果:

SELECT table1.col1, table1.col2, table1.SupplierID, 
       (SELECT Name
        FROM table2
        WHERE table2.ID = table1.SupplierID
        FETCH FIRST 1 ROW ONLY
       ) as SupplierName
FROM SIS_PRS table1;

需要注意的是,在两个数据库中,如果没有ORDER BY语句获取一行数据是可疑的。


2
在第一个例子中,您使用了SELECT ID, SupplierName,将(虚拟)表别名设置为Supp,并使用Supp.ID,Supp.Supplier选择了字段。这应该可以工作。但是在第二个例子中,您包含了相关子查询在SELECT语句中(其结果将成为返回的字段之一),但您正在选择2个字段SELECT ID,Name),并将结果字段定义为SupplierName。这会起作用吗(哪个字段将被返回)?我有什么遗漏的吗? - Lucas Basquerotto
2
@LucasBasquerotto...干得好。那是一个打字错误。 - Gordon Linoff
JOIN LATERAL 期望在表达式后面加上 ON true. - Alex Sham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接