首页 > 解决方案 > 在查询结果中包含子查询 WHERE 语句的值

问题描述

从我有限的经验来看,这似乎是一个相当复杂的 SQL 查询。

如何添加或编辑此查询,使其包含通过ees.cardate或子查询中检查的日期s3ees.cardate

这是我可能能够从中获取cardate值的子查询之一:

(EXISTS ( SELECT
                                    s3esc.carstage_model_id
                                    FROM
                                        carstage_model s3esc
                                        JOIN car_carstage s3ees USING (car_carstage_id)
                                    WHERE
                                        s3esc.car_model_id = ec1.car_model_id
                                        AND (s3esc.carmodelstatus_id = ANY (ARRAY[6, 8, 9, 11, 12]))
                                        AND s3ees.cardate >= '2020-07-23 02:55:50.552513'
                                    )
                                )

这是完整的查询:

WITH running_carmodel(car_model_id, rm_factory_id, factory_id, parent_id, model_id, rm_model_id, firstname, nickname, middlename, lastname, suffix, modelpreferredname_id, title, rank) AS (
                    SELECT ec.car_model_id, ecp.factory_id, ec.factory_id AS rm_factory_id, ec.parent_id, ec.model_id, ecp.model_id AS rm_model_id, c.firstname, c.nickname, c.middlename, c.lastname, c.suffix, c.modelpreferredname_id, o.title, o.rank
                    FROM car_model ec
                    JOIN car e USING (car_id), model c, factory o, car_model ecp
                    WHERE e.caryear::double precision >= date_part('year'::text, now())
                        AND ecp.model_id = c.model_id
                        AND ecp.factory_id = o.factory_id
                        AND ecp.car_model_id = ec.parent_id
              )
                    SELECT DISTINCT
                            1 AS q,
                            ot.rank AS ot_rank,
                            o.rank AS o_rank,
                            CASE
                                WHEN c.model_id IS NOT NULL THEN odn.rank
                                ELSE dn.rank
                            END AS dn_rank,
                            o.factory_id,
                            oc.state_id,
                            c.model_id,
                            CASE
                                WHEN c.model_id IS NOT NULL THEN odn.districtname_id
                                ELSE dn.districtname_id
                            END AS districtname_id,
                            CASE
                                WHEN true = false THEN true
                                
                                
                                
                                ELSE NULL
                            END AS redis_new,
                            c.firstname,
                            c.nickname,
                            c.middlename,
                            c.lastname,
                            c.suffix,
                            c.modelpreferredname_id,
                            oc.factory_model_id,
                            o.name AS factory,
                            o.title,
                            ot.rank,
                            CASE
                                WHEN c.model_id IS NOT NULL AND oc.districtname_id IS NULL THEN ''::character varying
                                WHEN dn.name::text ~ '^[0-9]+$'::text THEN ('District '::text || dn.name::text)::character varying
                                ELSE dn.name
                            END AS district,
                            ot.name AS factorytype,
                            ot.factorytype_id,
                            c.photourl,
                            pvs_factory_party(oc.factory_model_id) AS factory_party,
                            (SELECT
                                ecs.name
                                FROM
                                    carmodelstatus ecs
                                    JOIN carstage_model esc USING (carmodelstatus_id)
                                    JOIN car_carstage ees USING (car_carstage_id)
                                    JOIN carstage es USING (carstage_id)
                                    JOIN car_model ec USING (car_model_id)
                                    JOIN car e ON e.car_id = ees.car_id AND e.caryear::double precision = date_part('year'::text, now())
                                WHERE
                                    esc.car_model_id = ec.car_model_id
                                    AND ec.model_id = c.model_id
                                    AND ec.factory_id = o.factory_id
                                    AND (ec.districtname_id = odn.districtname_id OR ec.districtname_id IS NULL OR odn.districtname_id IS NULL)
                                    AND CASE WHEN ec.factory_id = 1 THEN ees.state_id = 'NA' ELSE TRUE END
                                    AND ees.modelrelease_id >= 2
                            ORDER BY es.rank DESC
                            LIMIT 1) AS car_status,
                            CASE
                                WHEN c.model_id IS NOT NULL THEN true
                                ELSE false
                            END AS incumbent,
                            ec1.districtname_id AS car_districtname_id,
                            rm.rm_model_id AS rm_model_id,
                            rm.firstname AS rm_firstname,
                            rm.middlename AS rm_middlename,
                            rm.nickname AS rm_nickname,
                            rm.lastname AS rm_lastname,
                            rm.suffix AS rm_suffix,
                            rm.title AS rm_title,
                            pvs_car_party(rm.parent_id) AS rm_party,
                            rm.modelpreferredname_id AS rm_modelpreferredname_id,
                            ob.name AS factorybranch,
                            l.name AS local
                            FROM
                                factory_state os
                                JOIN factory o USING (factory_id)
                                JOIN factorytype ot USING (factorytype_id)
                                LEFT JOIN factorybranch ob USING (factorybranch_id)
                                LEFT JOIN district d USING (factory_id, state_id)
                                LEFT JOIN districtname dn USING (districtname_id)
                                LEFT JOIN factory_model oc ON oc.factory_id = o.factory_id AND (oc.state_id = os.state_id OR oc.state_id = 'NA'::bpchar) AND (oc.districtname_id = d.districtname_id OR oc.districtname_id IS NULL ) AND (oc.factorymodelstatus_id = ANY (ARRAY[1, 3, 4]))
                                LEFT JOIN model c USING (model_id)
                                LEFT JOIN districtname odn ON odn.districtname_id = oc.districtname_id
                                LEFT JOIN car_model ec1 ON ec1.model_id = c.model_id AND (EXISTS ( SELECT
                                    s3esc.carstage_model_id
                                    FROM
                                        carstage_model s3esc
                                        JOIN car_carstage s3ees USING (car_carstage_id)
                                    WHERE
                                        s3esc.car_model_id = ec1.car_model_id
                                        AND (s3esc.carmodelstatus_id = ANY (ARRAY[6, 8, 9, 11, 12]))
                                        AND s3ees.cardate >= '2020-07-23 02:55:50.552513'
                                    )
                                )
                                LEFT JOIN running_carmodel rm ON rm.car_model_id = ec1.car_model_id AND rm.factory_id = o.factory_id
                                LEFT JOIN local l USING (local_id)
                            WHERE (
                                (
                                    oc.factorymodelstatus_id = ANY (ARRAY[1, 4])
                                    OR oc.factory_model_id IS NULL
                                )
                                AND (os.state_id = ANY (ARRAY['ME'::bpchar, 'NA'::bpchar]))
                                AND
                                    CASE
                                        WHEN o.factory_id = ANY (ARRAY[1, 3, 4, 6]) THEN true
                                        WHEN ot.factorytype_id = 'P'::bpchar THEN true
                                        WHEN o.factory_id = 5 THEN (dn.districtname_id IN (1) OR dn.districtname_id IN (978, 910, 917, 370))
                                        WHEN o.factory_id = 6 THEN dn.districtname_id IN (613, 914, 915, 2019, 2020)
                                        WHEN o.factory_id IN (7,8) THEN dn.districtname_id IN (36,37,40,41,42,43)
                                        WHEN o.factory_id = 9 THEN dn.districtname_id IN (25,27,28)
                                        WHEN ot.factorylevel_id = 'S'::bpchar THEN true
                                        WHEN ot.factorylevel_id = 'L'::bpchar AND oc.local_id IN (619,2438) THEN true
                                        ELSE false
                                    END
                                
                                
                                
                            )
                        UNION
                            SELECT DISTINCT
                                2 AS q,
                                ot.rank AS ot_rank,
                                o.rank AS o_rank,
                                dn.rank AS dn_rank,
                                o.factory_id,
                                ec.state_id,
                                c.model_id,
                                CASE
                                    WHEN o.factory_id = 6 THEN ( SELECT
                                        s2ec.districtname_id
                                        FROM
                                            car_model s2ec
                                            JOIN carstage_model s2esc USING (car_model_id)
                                        WHERE
                                            (s2esc.carmodelstatus_id = ANY (ARRAY[6, 7, 8, 9, 10, 11, 12, 13]))
                                            AND s2ec.factory_id = 6
                                            AND s2ec.state_id = ec.state_id
                                        LIMIT 1)
                                    ELSE dn.districtname_id
                                END AS districtname_id,
                                false AS redis_new,
                                c.firstname,
                                c.nickname,
                                c.middlename,
                                c.lastname,
                                c.suffix,
                                c.modelpreferredname_id,
                                ec.car_model_id AS factory_model_id,
                                o.name AS factory,
                                o.title,
                                ot.rank,
                                CASE
                                    WHEN dn.name::text ~ '^[0-9]+$'::text THEN ('District '::text || dn.name::text)::character varying
                                    ELSE dn.name
                                END AS district,
                                ot.name AS factorytype,
                                ot.factorytype_id,
                                c.photourl,
                                pvs_car_party(ec.car_model_id) AS factory_party,
                                (SELECT ssecs.name
                                    FROM carmodelstatus ssecs
                                    JOIN carstage_model ssesc USING (carmodelstatus_id)
                                    JOIN car_carstage ssees USING (car_carstage_id)
                                    JOIN carstage sses USING (carstage_id)
                                    WHERE
                                        ssesc.car_model_id = ec.car_model_id
                                        AND CASE
                                            WHEN o.factory_id = 1 THEN sses.carstage_id = 'G'::bpchar AND ssees.state_id = 'NA'
                                            ELSE true
                                        END
                                        AND ssees.modelrelease_id >= 2
                                    ORDER BY sses.rank DESC
                                LIMIT 1) AS car_status,
                                (SELECT true AS bool
                                    FROM factory_model s3oc
                                    JOIN factory s3o USING (factory_id)
                                    WHERE
                                        s3oc.factory_id = ec.factory_id
                                        AND (
                                            s3oc.districtname_id = ec.districtname_id
                                            OR s3oc.districtname_id IS NULL
                                            OR ec.factory_id = 6
                                            OR s3o.factorytype_id = 'K'::bpchar
                                            AND ec.state_id = 'ME'::bpchar
                                        )
                                        AND s3oc.state_id = ec.state_id
                                        AND s3oc.model_id = c.model_id
                                        AND s3oc.factorymodelstatus_id IN (1,4)
                                LIMIT 1) AS incumbent,
                                (-1) AS car_districtname_id,
                                rm.rm_model_id AS rm_model_id,
                                rm.firstname AS rm_firstname,
                                rm.middlename AS rm_middlename,
                                rm.nickname AS rm_nickname,
                                rm.lastname AS rm_lastname,
                                rm.suffix AS rm_suffix,
                                rm.title AS rm_title,
                                pvs_car_party(rm.parent_id) AS rm_party,
                                rm.modelpreferredname_id AS rm_modelpreferredname_id,
                                ob.name AS factorybranch,
                                NULL AS local
                            FROM
                                model c
                                JOIN car_model ec USING (model_id)
                                JOIN car e ON e.car_id = ec.car_id
                                JOIN factory o USING (factory_id)
                                JOIN factorytype ot ON ot.factorytype_id = o.factorytype_id
                                JOIN car_carstage ees ON ees.car_id = e.car_id AND ees.state_id = ec.state_id
                                JOIN carstage_model esc USING (car_model_id, car_carstage_id)
                                LEFT JOIN factorybranch ob USING (factorybranch_id)
                                LEFT JOIN running_carmodel rm ON rm.car_model_id = ec.car_model_id
                                LEFT JOIN districtname dn USING (districtname_id)
                            WHERE
                                (ec.state_id = ANY (ARRAY['ME'::bpchar, 'NA'::bpchar]))
                                AND ees.cardate >= '2020-07-23 02:55:50.552513'
                                
                                AND CASE
                                    WHEN o.factory_id = 1 THEN ec.major
                                    WHEN o.factory_id = 2 THEN (EXISTS ( SELECT s6ec.car_model_id
                                       FROM car_model s6ec
                                        JOIN carstage_model s6esc USING (car_model_id)
                                        WHERE (
                                            s6esc.carmodelstatus_id = ANY (ARRAY[6, 8, 9, 11, 12]))
                                            AND s6ec.model_id = ec.parent_id
                                            AND s6ec.major = true
                                        )
                                    )
                                    WHEN o.factory_id = ANY (ARRAY[3, 4, 6]) THEN true
                                    WHEN ot.factorytype_id = 'P'::bpchar THEN true
                                    WHEN o.factory_id = 5 THEN (dn.districtname_id IN (1) OR dn.districtname_id IN (978, 910, 917, 370))
                                    WHEN o.factory_id = 6 THEN dn.districtname_id IN (613, 914, 915, 2019, 2020)
                                    WHEN o.factory_id IN (7,8) THEN dn.districtname_id IN (36,37,40,41,42,43)
                                    WHEN o.factory_id = 9 THEN dn.districtname_id IN (25,27,28)
                                    WHEN ot.factorylevel_id = 'S'::bpchar THEN true
                                    ELSE false
                                END
                                AND ees.modelrelease_id >= 1
                                AND e.caryear >= 2020
                        ORDER BY 1, 2, 3, 4, 18, 13

标签: sqlpostgresql

解决方案


推荐阅读