Đưa ra thiết lập này trong Postgres hiện tại 9.4 ( từ câu hỏi liên quan này ):
CREATE TABLE foo (ts, foo) AS
VALUES (1, 'A') -- int, text
, (7, 'B');
CREATE TABLE bar (ts, bar) AS
VALUES (3, 'C')
, (5, 'D')
, (9, 'E');
Ngoài ra còn có SQL Fiddle từ câu hỏi trước.
Tôi đã viết một SELECT
với một FULL JOIN
để đạt được mục tiêu của câu hỏi được tham khảo. Giản thể:
SELECT ts, f.foo, b.bar
FROM foo f
FULL JOIN bar b USING (ts);
Theo thông số kỹ thuật, cách chính xác để giải quyết cột ts
là không có đủ điều kiện bảng. Một trong hai giá trị đầu vào ( f.ts
hoặc b.ts
) có thể là NULL. Các USING
khoản tạo ra một chút của một trường hợp kỳ lạ: giới thiệu một cột "đầu vào" đó không phải là thực sự hiện diện trong đầu vào. Cho đến nay thanh lịch.
Tôi đặt cái này trong hàm plpgsql. Để thuận tiện (hoặc yêu cầu) tôi muốn các tên cột giống nhau cho kết quả của hàm bảng. Vì vậy, chúng ta phải tránh xung đột đặt tên giữa các tên cột giống nhau và các tham số hàm. Tốt nhất nên tránh bằng cách chọn các tên khác nhau, nhưng ở đây chúng tôi là:
CREATE OR REPLACE FUNCTION f_merge_foobar()
RETURNS TABLE(ts int, foo text, bar text) AS
$func$
BEGIN
FOR ts, foo, bar IN
SELECT COALESCE(f.ts, b.ts), f.foo, b.bar
FROM foo f
FULL JOIN bar b USING (ts)
LOOP
-- so something
RETURN NEXT;
END LOOP;
END
$func$ LANGUAGE plpgsql;
Nhấn mạnh đậm để làm nổi bật vấn đề . Tôi không thể sử dụng mà không có trình độ bảng như trước đây, bởi vì plpgsql sẽ đưa ra một ngoại lệ (không thực sự cần thiết, nhưng có lẽ hữu ích trong hầu hết các trường hợp):ts
ERROR: column reference "ts" is ambiguous LINE 1: SELECT ts, f.foo, b.bar ^ DETAIL: It could refer to either a PL/pgSQL variable or a table column.
Tôi biết tôi có thể sử dụng các tên khác nhau hoặc truy vấn con hoặc sử dụng chức năng khác. Nhưng tôi tự hỏi nếu có một cách để tham khảo cột. Tôi không thể sử dụng bảng chất lượng. Người ta sẽ nghĩ nên có một cách.
Lanhung?