PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL त्रुटि:FROM में सबक्वेरी समान क्वेरी स्तर के अन्य संबंधों को संदर्भित नहीं कर सकता है

डिबगिंग के लिए, मैंने परीक्षण परिदृश्य बनाया:
आपको इसे प्रश्न में अपने सेटअप में शामिल करना चाहिए था।

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

कुछ सुधारों के बाद यह अब काम करता है:

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;

कॉल करें:

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"

प्रमुख बिंदु

  • पहले फ़ंक्शन बनाएं, आपके सेटअप में निष्पादन अनुक्रम उलट गया है
  • फ़ंक्शन समानता में आपको एक ही नाम के OUT पैरामीटर (user_id) के साथ नाम विरोध से बचने के लिए कॉलम नामों को योग्य बनाना होगा , distance , explanation )।
  • आपकी सीटीई समानताएं उलझी हुई थीं। मैंने फ़ंक्शन कॉल समानता_जेंडर (..) को चयन सूची में खींच लिया। दो बार कॉल न करने के लिए, मैंने इसे अगले चरण में विभाजित कर दिया।
  • संयुक्त प्रकार के क्षेत्रों तक पहुँचने के लिए कोष्ठक का उपयोग करें। ठीक मैनुअल यहां देखें। ।
  • फ़ंक्शन का रिटर्न प्रकार समानता () में एक बग था:explanation hstore . 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. निष्क्रिय PostgreSQL कनेक्शन के लिए कोई समयबाह्य है?

  2. PostGIS का उपयोग करके दिए गए बिंदु के लिए निकटतम पड़ोसियों का पता लगाएं?

  3. मेरे पास COUNT('e.id') या COUNT(e.id) के लिए क्वेरी से भिन्न परिणाम हैं

  4. एलेम्बिक यूज कमांड एरर आइडेंटिफायर नहीं ढूंढ सकता

  5. नेस्टेड JSONB फ़ील्ड में ऑब्जेक्ट्स के लिए Postgresql क्वेरी