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

LỖI PostgreSQL:truy vấn con trong FROM không thể tham chiếu đến các quan hệ khác có cùng mức truy vấn

Để gỡ lỗi, tôi đã tạo kịch bản thử nghiệm:
Bạn nên đưa điều đó vào thiết lập của mình trong câu hỏi.

-- drop schema x CASCADE;
create schema x
create table x.users(id int);
create table x.demographics (user_id int, gender text);

INSERT INTO x.users VALUES (1),(2),(3),(4),(5);
INSERT INTO x.demographics VALUES (1, 'm'),(2, 'f'),(3, 'm'),(4, 'f'),(5, 'm');

Tính năng này hiện hoạt động sau một số bản sửa lỗi:

create type x.similarity as (
  distance    float,
  explanation text
);

create or replace function x.similarity_gender(my_gender text, other_gender text)
returns x.similarity as $$
  declare
    distance  float;
    sim       x.similarity;
  begin
    if my_gender is null or other_gender is null then
      distance = 0.9;
    elsif (my_gender = other_gender) then
      distance = 0.0;
    else
      distance = 1.0;
    end if;

    sim.distance     = distance;
    sim.explanation  = hstore('gender', cast(sim.distance as text));
    return sim;
  end;
$$ language plpgsql immutable;


create or replace function x.similarity(my_user_id int)
returns table(user_id int, distance float, explanation text) as $$

  with factors as (
    select u.id as user_id, d.gender
    from x.users u
    join x.demographics d on u.id = d.user_id),

  my_factors as (
    select f.user_id, f.gender
    from factors  f
    where f.user_id = $1),

  similarities as (
    select f.user_id, x.similarity_gender(m.gender, f.gender) AS sim
    from factors f, my_factors m)

  select s.user_id, (s.sim).distance, (s.sim).explanation
    from similarities s;
$$ language sql stable strict;

Gọi:

test=# SELECT * FROM x.similarity(2);
 user_id | distance |  explanation
---------+----------+---------------
       1 |        1 | "gender"=>"1"
       2 |        0 | "gender"=>"0"
       3 |        1 | "gender"=>"1"
       4 |        0 | "gender"=>"0"
       5 |        1 | "gender"=>"1"

Những điểm chính

  • Trước tiên, hãy tạo hàm, bạn đã đảo ngược trình tự thực thi trong quá trình thiết lập của mình
  • Trong sự tương tự về chức năng, bạn phải đủ điều kiện cho các tên cột để tránh xung đột tên với các tham số OUT có cùng tên (user_id , distance , explanation ).
  • Các điểm tương đồng về CTE của bạn đã bị xáo trộn. Tôi đã kéo lệnh gọi hàm tương tự_ giới tính (..) vào danh sách CHỌN. Để không phải gọi hai lần, tôi chia nhỏ trong bước tiếp theo.
  • Sử dụng dấu ngoặc đơn để truy cập các trường của các loại kết hợp. Tham khảo hướng dẫn tốt tại đây .
  • Loại trả về của hàm tương tự () có lỗi:explanation hstore . Phải là explanation text .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để thay đổi định dạng ngày trong Postgres?

  2. Không có ánh xạ phương ngữ cho loại JDBC:2003

  3. Làm thế nào để chỉ ra rằng một cột không thể null khi tạo một dạng xem cụ thể hóa?

  4. Làm thế nào để sử dụng `RETURN NEXT` trong PL / pgSQL một cách chính xác?

  5. Cách điền ngày bị thiếu trong PostgreSQL bằng cách sử dụng create_series