PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

BŁĄD PostgreSQL:podzapytanie w FROM nie może odnosić się do innych relacji tego samego poziomu zapytania

Do debugowania stworzyłem scenariusz testowy:
Powinieneś był uwzględnić to w swojej konfiguracji w pytaniu.

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

To działa teraz, po kilku poprawkach:

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;

Zadzwoń:

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"

Główne punkty

  • Najpierw utwórz funkcję, masz odwróconą kolejność wykonywania w konfiguracji
  • W przypadku podobieństwa funkcji musisz określić nazwy kolumn, aby uniknąć konfliktów nazw z parametrami OUT o tej samej nazwie (user_id , distance , explanation ).
  • Twoje podobieństwa CTE zostały zniekształcone. Wyciągnąłem wywołanie funkcji similarity_gender(..) na listę SELECT. Aby nie dzwonić dwa razy, podzieliłem to w następnym kroku.
  • Użyj nawiasów, aby uzyskać dostęp do pól typów złożonych. Zapoznaj się z dokładną instrukcją .
  • Zwracany typ funkcji podobieństwa() miał błąd:explanation hstore . Musi być 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. Jak zmapować kolumnę znacznika czasu na typ JPA?

  2. Kiedy uruchamiam przypadki testowe otrzymuję ten błąd:psycopg2.OperationalError:cursor _django_curs_140351416325888_23 nie istnieje

  3. Izolacja transakcji w PostgreSQL

  4. Zwróć tablicę lat jako zakresy lat

  5. Jak zainstalować PostgreSQL 9.1 na OSX Lion?