簡體   English   中英

如何僅在 PostgreSQL 中自連接一部分行?

[英]How to self join only a subset of rows in PostgreSQL?

給定下表:

CREATE TABLE people (
    name TEXT PRIMARY KEY,
    age  INT  NOT NULL
);

INSERT INTO people VALUES
    ('Lisa',     30),
    ('Marta',    27),
    ('John',     32),
    ('Sam',      41),
    ('Alex',     12),
    ('Aristides',43),
    ('Cindi',     1)
    ;

我正在使用自聯接將特定列的每個值與同一列的所有其他值進行比較。 我的查詢看起來像這樣:

SELECT DISTINCT A.name as child
FROM people A, people B
WHERE A.age + 16 < B.age;

此查詢旨在根據年齡差異發現潛在的兒子/女兒。 更具體地說,我的目標是確定可能與他們的父母之一住在同一所房子里的一組人(按姓名排序),假設孩子和他們的父母之間必須有至少 16 歲的年齡差異.

現在我想將這種邏輯與另一個表中的信息結合起來。

另一個表看起來像這樣:

CREATE TABLE houses (
    house_name TEXT NOT NULL,
    house_member TEXT NOT NULL REFERENCES people(name)
);    

INSERT INTO houses VALUES
        ('house Smith', 'Lisa'),
        ('house Smith', 'Marta'),
        ('house Smith', 'John'),
        ('house Doe', 'Lisa'),
        ('house Doe', 'Marta'),
        ('house Doe', 'Alex'),
        ('house Doe', 'Sam'),
        ('house McKenny', 'Aristides'),
        ('house McKenny', 'John'),
        ('house McKenny', 'Cindi')
        ;

這兩個表可以在ON houses.house_member = people.name上連接。

更具體地說,我想只在同一所房子里發現孩子們。 將每個人的年齡與所有其他人的年齡進行比較是沒有意義的,但是將每個人的年齡與同一所房子中的所有其他人的年齡進行比較會更有效。

我的想法是從上面執行自連接,但只能在PARTITION BY household_name內。 但是,我認為這不是一個好主意,因為我沒有聚合函數。 這同樣適用於GROUP BY語句。 我能在這里做什么?

預期的輸出應如下所示,由house_member

家庭成員
亞歷克斯
辛迪

為簡單起見,我創建了一個fiddle

首先連接兩個表以構建一個包含所有三個信息位的表: house_namehouse_memberage

然后像原來一樣加入它自己,並添加一個額外的過濾器以僅查看相同的家庭。

WITH
CTE_All
AS
(
    SELECT
        houses.house_name
        ,houses.house_member
        ,people.age
    FROM
        houses
        INNER JOIN people ON people.name = houses.house_member
)
SELECT DISTINCT
    Children.house_name
    ,Children.house_member AS child_name
FROM
    CTE_All AS Children
    INNER JOIN CTE_All AS Parents 
        ON Children.age + 16 < Parents.age
        -- this is our age difference
        AND Children.house_name = Parents.house_name
        -- within the same house
;

所有這些都是一個單一的查詢。 您不必使用 CTE,您可以將其作為子查詢內聯,但使用 CTE 更具可讀性。

結果

房子名 | 孩子名
 :------------ |  :---------
房子 Doe | 亞歷克斯      
房子麥肯尼| 辛迪     

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM