PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL ERROR:subquery di FROM tidak dapat merujuk ke relasi lain dengan level kueri yang sama

Untuk debugging, saya membuat skenario pengujian:
Anda harus menyertakannya dalam penyiapan dalam pertanyaan.

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

Ini berfungsi sekarang, setelah beberapa perbaikan:

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;

Telepon:

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"

Poin utama

  • Buat fungsi terlebih dahulu, Anda memiliki urutan eksekusi terbalik dalam pengaturan Anda
  • Dalam kesamaan fungsi, Anda harus memenuhi syarat nama kolom untuk menghindari konflik nama dengan parameter OUT dari nama yang sama (user_id , distance , explanation ).
  • Kesamaan CTE Anda rusak. Saya menarik panggilan fungsi similarity_gender(..) ke dalam daftar SELECT. Agar tidak menelepon dua kali, saya membaginya di langkah berikutnya.
  • Gunakan tanda kurung untuk mengakses bidang tipe komposit. Lihat manual bagus di sini .
  • Tipe pengembalian kesamaan fungsi() memiliki bug:explanation hstore . Harus 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. SQL SELECT kecepatan int vs varchar

  2. Perbedaan antara Replikasi Aliran dan replikasi logis

  3. Bagaimana cara menghilangkan titik di to_char jika angkanya bilangan bulat?

  4. Ekspresi kueri Django untuk bidang terhitung yang memerlukan kondisi dan casting

  5. Cara menggunakan gabungan dalam dengan subkueri di Laravel Eloquent