Snowflake (LEFT JOIN) LATERAL: неподдерживаемый тип подзапроса не может быть оценен - PullRequest
1 голос
/ 01 марта 2020

Боковое соединение

В предложении FROM ключевое слово LATERAL позволяет встроенному представлению ссылаться на столбцы из табличного выражения, предшествующего этому встроенному представлению.

Боковое соединение ведет себя скорее как коррелированный подзапрос, чем как большинство JOIN.

Давайте немного подправим код, приведенный в документации:

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);  

Запрос:

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 <> fiddle demo

...