Re: Using Lateral - Mailing list pgsql-general

From Johann Spies
Subject Re: Using Lateral
Date
Msg-id CAGZ55DQ879LAzNgah5tdHK8p4So4vfX-k1aw+v=JMka9_gV3Vw@mail.gmail.com
Whole thread Raw
In response to Re: Using Lateral  (Paul Jungwirth <pj@illuminatedcomputing.com>)
Responses Re: Using Lateral  (Paul Jungwirth <pj@illuminatedcomputing.com>)
List pgsql-general
Thanks Paul.

I was hesitant to post my full query.  It is a long and complicated
query.  But here it is now:

WITH p AS (
    SELECT
        ARRAY [ ARRAY [ 't',
'http://scientific.thomsonreuters.com/schema/wok5.4/public/FullRecord'
] ] AS ns),
uts AS (
    SELECT
        s.ut
    FROM
        wos_source.core_2015 s
    WHERE
        s.id BETWEEN 999900
        AND 100000
             ),
utsb AS (
    SELECT
        b.ut
    FROM
        wos_2017_1.belongs2 b,
        uts
    WHERE
        b.ut = uts.ut), q AS (
    SELECT
        s.ut,
        unnest (xpath
('//t:static_data/t:fullrecord_metadata/t:addresses/t:address_name/t:address_spec',
                xml,
                ns)) AS address_spec
    FROM
        p,
        uts a
    LEFT JOIN utsb b ON b.ut = a.ut
    LEFT JOIN wos_source.core_2015 s ON s.ut = a.ut
WHERE
    b.ut IS NULL), r AS (
    SELECT
        s.ut,
        unnest (xpath
('//t:static_data/t:item/t:reprint_contact/t:address_spec',
                xml,
                ns)) AS raddress_spec
    FROM
        p,
        wos_2017_1.publication l,
        uts a
    LEFT JOIN utsb b ON b.ut = a.ut
    LEFT JOIN wos_source.core_2015 s ON s.ut = a.ut
WHERE
    b.ut IS NULL
    AND xpath_exists
('//t:static_data/t:item/t:reprint_contact/t:address_spec', xml, ns)
    AND s.ut = l.ut
    AND l.pubyear < 1998), qd AS (
    SELECT
        DISTINCT ut,
        CASE
            WHEN xpath_exists ('//t:address_spec/t:country/text()',
                q.address_spec,
                p.ns)
            THEN unnest (xpath ('//t:address_spec/t:country/text()',
                    q.address_spec,
                    p.ns))::citext
            ELSE NULL
        END country,
        CASE
            WHEN xpath_exists ('//t:address_spec/t:city/text()',
                q.address_spec,
                p.ns)
            THEN unnest (xpath ('//t:address_spec/t:city/text()',
                    q.address_spec,
                    p.ns))::citext
            ELSE NULL
        END city,
        CASE
            WHEN xpath_exists ('//t:organizations/t:organization/text()',
                q.address_spec,
                ns)
            THEN unnest (xpath ('//t:organizations/t:organization/text()',
                    q.address_spec,
                    ns))::citext
            ELSE NULL
        END organisation,
        CASE
            WHEN xpath_exists
('//t:organizations/t:organization[@pref="Y"]/text()',
                q.address_spec,
                ns)
            THEN unnest (xpath
('//t:organizations/t:organization[@pref="Y"]/text()',
                    q.address_spec,
                    ns))::citext
            ELSE NULL
        END AS prefname,
        CASE
            WHEN xpath_exists ('//t:suborganizations/t:suborganization/text()',
                q.address_spec,
                ns)
            THEN unnest (xpath ('//t:suborganizations/t:suborganization/text()',
                    q.address_spec,
                    ns))::citext
            ELSE NULL
        END suborgname,
        CASE
            WHEN xpath_exists ('/t:address_spec/@addr_no',
                q.address_spec,
                ns)
            THEN (xpath ('/t:address_spec/@addr_no',
                    q.address_spec,
                    ns))
            [ 1 ]::text::INTEGER
            ELSE NULL
        END addr_no
    FROM
        p,
        q),
rd AS (
    SELECT
        DISTINCT ut,
        CASE
            WHEN xpath_exists ('//t:address_spec/t:country/text()',
                r.raddress_spec,
                p.ns)
            THEN unnest (xpath ('//t:address_spec/t:country/text()',
                    r.raddress_spec,
                    p.ns))::citext
            ELSE NULL
        END country,
        CASE
            WHEN xpath_exists ('//t:address_spec/t:city/text()',
                r.raddress_spec,
                p.ns)
            THEN unnest (xpath ('//t:address_spec/t:city/text()',
                    r.raddress_spec,
                    p.ns))::citext
            ELSE NULL
        END city,
        CASE
            WHEN xpath_exists ('//t:organizations/t:organization/text()',
                r.raddress_spec,
                ns)
            THEN unnest (xpath ('//t:organizations/t:organization/text()',
                    r.raddress_spec,
                    ns))::citext
            ELSE NULL
        END organisation,
        CASE
            WHEN xpath_exists
('//t:organizations/t:organization[@pref="Y"]/text()',
                r.raddress_spec,
                ns)
            THEN unnest (xpath
('//t:organizations/t:organization[@pref="Y"]/text()',
                    r.raddress_spec,
                    ns))::citext
            ELSE NULL
        END AS prefname,
        CASE
            WHEN xpath_exists ('//t:suborganizations/t:suborganization/text()',
                r.raddress_spec,
                ns)
            THEN unnest (xpath ('//t:suborganizations/t:suborganization/text()',
                    r.raddress_spec,
                    ns))::citext
            ELSE NULL
        END suborgname,
        CASE
            WHEN xpath_exists ('/t:address_spec/@addr_no',
                r.raddress_spec,
                ns)
            THEN (xpath ('/t:address_spec/@addr_no',
                    r.raddress_spec,
                    ns))
            [ 1 ]::text::INTEGER
            ELSE NULL
        END reprint_addr_no
    FROM
        p,
        r
    WHERE
        r.raddress_spec IS NOT NULL), uq AS (
    SELECT
        DISTINCT qd.ut,
        qd.addr_no::INTEGER,
        0 AS reprint_addr_no,
        c.uuid city_id,
        y.uuid country_id,
        o.uuid organisation_id,
        u.uuid suborg_id,
        p.uuid pref_name_id
    FROM
        qd
    LEFT JOIN wos_2017_1.city c ON (c.city = qd.city)
    LEFT JOIN wos_2017_1.country_alias y ON (y.country = qd.country)
    LEFT JOIN wos_2017_1.organisation o ON (o.organisation = regexp_replace (
         regexp_replace (
             regexp_replace (qd.organisation, '<', '<', 'g'),
        '&', '&', 'g'),
    '>', '>', 'g'))
    LEFT JOIN wos_2017_1.org_pref_name p ON (p.name = qd.prefname)
    LEFT JOIN wos_2017_1.suborg u ON (u.suborgname = regexp_replace (
         regexp_replace (
             regexp_replace (qd.suborgname, '<', '<', 'g'),
        '&', '&', 'g'),
    '>', '>', 'g'))),
ur AS (
    SELECT
        DISTINCT rd.ut,
        0 AS addr_no,
        rd.reprint_addr_no::INTEGER,
        c.uuid city_id,
        y.uuid country_id,
        o.uuid organisation_id,
        u.uuid suborg_id,
        p.uuid pref_name_id
    FROM
        r,
        rd
    LEFT JOIN wos_2017_1.city c ON (c.city = rd.city)
    LEFT JOIN wos_2017_1.country_alias y ON (y.country = rd.country)
    LEFT JOIN wos_2017_1.organisation o ON (o.organisation = regexp_replace (
         regexp_replace (
             regexp_replace (rd.organisation, '<', '<', 'g'),
        '&', '&', 'g'),
    '>', '>', 'g'))
    LEFT JOIN wos_2017_1.org_pref_name p ON (p.name = rd.prefname)
    LEFT JOIN wos_2017_1.suborg u ON (u.suborgname = regexp_replace (
         regexp_replace (
             regexp_replace (rd.suborgname, '<', '<', 'g'),
        '&', '&', 'g'),
    '>', '>', 'g'))
WHERE
    r.raddress_spec IS NOT NULL), qr AS (
    SELECT
        *
    FROM
        uq
    UNION
    SELECT
        ur.*
    FROM
        ur)
SELECT
    DISTINCT ON (qr.ut,
        qr.addr_no,
        qr.reprint_addr_no,
        a.uuid,
        qr.organisation_id,
        qr.suborg_id,
        qr.pref_name_id)
    qr.ut,
    qr.addr_no,
    qr.reprint_addr_no,
    a.uuid AS address_id,
    qr.organisation_id,
    qr.suborg_id,
    qr.pref_name_id,
    uuid_generate_v1 ()
    uuid
FROM
    qr
    LEFT JOIN wos_2017_1.address a ON (a.city_id = qr.city_id
        AND a.country_id = qr.country_id)




Johann
-- 
Because experiencing your loyal love is better than life itself,
my lips will praise you.  (Psalm 63:3)


pgsql-general by date:

Previous
From: Juan Manuel Cuello
Date:
Subject: Re: Connection hangs on new created schema
Next
From: Tomas Vondra
Date:
Subject: Re: Postgresql 10.3 , query never completes if LIMIT clause isspecified and paralle processing is on