PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Chọn từ hàm PostgreSQL trả về kiểu kết hợp

Postgres 9.3 trở lên

Sử dụng LATERAL tham gia!

SELECT p.id, p.name, p.data, f.*
FROM   tb_projects p
LEFT   JOIN LATERAL fn_getlinkedproject(p.id) f(linked_id, lined_name) ON TRUE;

Kết quả:

 id |  data  |  name  | linked_id | linked_name
----+--------+--------+-----------+-------------
  1 | data_1 | name_1 |         2 | name_2
  2 | data_2 | name_2 |         3 | name_3
  3 | data_3 | name_3 |         1 | name_1

Xem:

Postgres 9.2 trở lên

Kém vì một số lý do. Việc đính kèm bí danh cột không đơn giản. Thay vì đổi tên các tên xung đột khác:

SELECT p.id AS p_id, p.data AS p_data, p.name AS p_name, (fn_getlinkedproject(p.id)).*
FROM   tb_projects p;

Kết quả:

 p_id | p_data | p_name | id |  name
------+--------+--------+----+--------
    1 | data_1 | name_1 |  2 | name_2
    2 | data_2 | name_2 |  3 | name_3
    3 | data_3 | name_3 |  1 | name_1

Để đổi tên các cột kết quả, bạn phải:

SELECT p.id, p.data, p.name
     ,(fn_getlinkedproject(p.id)).id   AS linked_id
     ,(fn_getlinkedproject(p.id)).name AS linked_name
FROM   tb_projects p;

Cả hai giải pháp cũ đều giải quyết cùng một kế hoạch truy vấn (kém) là gọi hàm nhiều lần.

Để tránh điều đó, hãy sử dụng truy vấn con:

SELECT p.id, p.data, p.name
    , (p.x).id AS linked_id, (p.x).name AS linked_name
FROM  (SELECT *, fn_getlinkedproject(id) AS x FROM tb_projects) p;

Lưu ý vị trí của dấu ngoặc đơn cần thiết .
Đọc hướng dẫn về các loại kết hợp .

Bản trình diễn

CREATE TYPE dm_nameid AS (
  id   int
, name text); -- types simplified for demo

CREATE TABLE tb_projects(
  id   int
, data text
, name text);

INSERT INTO tb_projects VALUES
  (1, 'data_1', 'name_1')
, (2, 'data_2', 'name_2')
, (3, 'data_3', 'name_3');

CREATE function fn_getlinkedproject(integer)  -- avoiding CaMeL-case for demo
  RETURNS dm_nameid LANGUAGE sql AS
'SELECT id, name FROM tb_projects WHERE id = ($1 % 3) + 1';

db <> fiddle tại đây




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách kiểm tra ngày trùng lặp trong PostgreSQL

  2. Chỉ mục một phần không được sử dụng trong mệnh đề ON CONFLICT khi thực hiện nâng cấp trong Postgresql

  3. Cách lọc các truy vấn postgis dựa trên ST_GeometryType

  4. Tập lệnh SQL để tạo tập lệnh chèn

  5. PostgreSQL nhiều giao dịch trên cùng một kết nối