Sql 那就好了“说实话,我想你可能会从第一点中受益。四,。只有.:-)这是一个非常奇怪的查询,老实说,如果没有模式,很难给出一个好的答案。从技术上讲,使用with语句没有错。这和使用派生表没什么区别。如果有存储过程的原因,这就是原因。它将更易于维护,并且可能更高

Sql 那就好了“说实话,我想你可能会从第一点中受益。四,。只有.:-)这是一个非常奇怪的查询,老实说,如果没有模式,很难给出一个好的答案。从技术上讲,使用with语句没有错。这和使用派生表没什么区别。如果有存储过程的原因,这就是原因。它将更易于维护,并且可能更高,sql,oracle,performance,common-table-expression,Sql,Oracle,Performance,Common Table Expression,那就好了“说实话,我想你可能会从第一点中受益。四,。只有.:-)这是一个非常奇怪的查询,老实说,如果没有模式,很难给出一个好的答案。从技术上讲,使用with语句没有错。这和使用派生表没什么区别。如果有存储过程的原因,这就是原因。它将更易于维护,并且可能更高效。 WITH target_documents AS ( SELECT <Necessary fields> FROM documents l WHE


那就好了“说实话,我想你可能会从第一点中受益。四,。只有.:-)这是一个非常奇怪的查询,老实说,如果没有模式,很难给出一个好的答案。从技术上讲,使用
with
语句没有错。这和使用派生表没什么区别。如果有存储过程的原因,这就是原因。它将更易于维护,并且可能更高效。
    WITH target_documents AS (
        SELECT
            <Necessary fields>
        FROM documents l
        WHERE
            <Suitable document criteria>
    ),
    target_documents_type_1 AS (
        SELECT * FROM target_documents WHERE type = 1
    ),
    target_documents_type_2 AS (
        SELECT * FROM target_documents WHERE type = 2
    ),
    target_customers AS (
        SELECT
            <Necessary fields>
        FROM customers a
        WHERE
            <Suitable customer criteria>
            AND
            EXISTS(
                SELECT 1 FROM target_documents l WHERE l.customer_id = a.customer_id 
            )
    ),
    target_customers_type_1 AS (
        SELECT * FROM target_customers a WHERE EXISTS(
            SELECT 1 FROM target_documents_type_1 l WHERE l.customer_id = a.customer_id 
        )
        AND ROWNUM <= (<N> / 2)
    ),
    target_customers_type_2 AS (
        SELECT * FROM target_customers a WHERE EXISTS(
            SELECT 1 FROM target_documents_type_2 l WHERE l.customer_id = a.customer_id 
        )
        AND a.customer_id NOT IN (
            SELECT customer_id FROM target_customers_type_1
        )
        AND ROWNUM <= <N> 
    ),
    -- This is the set, which meets the the primary criteria:
    -- Contains only distinct customers
    -- The amount of different document types is balanced as much as possible
    different_customers_set AS (
        SELECT
            <Necessary fields>
        FROM target_customers_type_1 a -- rows 0--(<N>/2) amount
        JOIN target_documents_type_1 l ON (l.customer_id = a.customer_id)
        WHERE
            l.create_dt = (SELECT MAX(create_dt) FROM target_documents_type_1 WHERE customer_id = l.customer_id)
        UNION ALL
        SELECT
            <Necessary fields>
        FROM target_customers_type_2 a -- rows 0--<N> amount
        JOIN target_documents_type_2 l ON (l.customer_id = a.customer_id)
        WHERE
            l.create_dt = (SELECT MAX(create_dt) FROM target_documents_type_2 WHERE customer_id = l.customer_id) AND
            ROWNUM <= <N> - (SELECT COUNT(*) FROM target_customers_type_1) -- Limit the total to max N rows
    )

    -- Final result: primary criteria result filled with the result of secondary criteria
    SELECT * FROM different_customers_set
    UNION ALL
    SELECT
        <Necessary fields>
    FROM target_customers a
    JOIN target_documents l ON (l.customer_id = a.customer_id AND l.document_id NOT IN (SELECT document_id FROM different_customers_set))
    WHERE
        ROWNUM <= <N> - (SELECT COUNT(1) FROM different_customers_set);