横向连接
在 FROM 子句中,LATERAL 关键字允许内联视图引用该内联视图之前的表表达式中的列。
横向连接的行为更像是相关子查询,而不是大多数连接。
让我们稍微调整一下文档中提供的代码:
CREATE TABLE departments (department_id INTEGER, name VARCHAR);
CREATE TABLE employees (employee_ID INTEGER, last_name VARCHAR,
department_ID INTEGER, project_names ARRAY);
INSERT INTO departments (department_ID, name) VALUES
(1, 'Engineering'),
(2, 'Support'),
(3, 'HR'); -- adding new row
INSERT INTO employees (employee_ID, last_name, department_ID) VALUES
(101, 'Richards', 1),
(102, 'Paulson', 1),
(103, 'Johnson', 2);
Query:
SELECT *
FROM departments AS d,
LATERAL (SELECT * FROM employees AS e
WHERE e.department_ID = d.department_ID
ORDER BY employee_id DESC LIMIT 1) AS iv2 -- adding ORDER BY ... LIMIT ...
ORDER BY employee_ID;
SQL编译错误:无法计算不支持的子查询类型
是的,我知道我可以重写这个查询ROW_NUMBER()
或其他方式。
1)为什么使用TOP/LIMIT
在这种特殊情况下不可能吗?
2)有没有语法可以实现LEFT JOIN LATERAL/OUTER APPLY
?
我也希望能够获取结果集中的所有源行,即使 LATERAL 子查询没有为它们生成任何行。得到最终结果:
┌────────────────┬──────────────┬──────────────┬────────────┬────────────────┬───────────────┐
│ department_id │ name │ employee_id │ last_name │ department_id │ project_names │
├────────────────┼──────────────┼──────────────┼────────────┼────────────────┼───────────────┤
│ 1 │ Engineering │ 102 │ Paulson │ 1 │ null │
│ 2 │ Support │ 103 │ Johnson │ 2 │ null │
│ 3 │ HR │ null │ null │ null │ null │
└────────────────┴──────────────┴──────────────┴────────────┴────────────────┴───────────────┘
db小提琴演示