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