Oracle 设置:
CREATE TABLE table_a ( C1, C2, Value ) AS
SELECT 'All', 'All', 5 FROM DUAL UNION ALL
SELECT 'da', 'All', 6 FROM DUAL UNION ALL
SELECT 'da', 'b', 4 FROM DUAL;
CREATE TABLE table_b ( C1, C2 ) AS
SELECT 'cc', 'a' FROM DUAL UNION ALL
SELECT 'da', 'b' FROM DUAL UNION ALL
SELECT 'da', 'c' FROM DUAL;
查询:
SELECT b.C1,
b.C2,
( SELECT MAX ( value ) KEEP (
DENSE_RANK FIRST
ORDER BY
CASE WHEN b.C1 = a.C1 AND b.C2 = a.C2 THEN 1
WHEN b.C1 = a.C1 THEN 2
ELSE 3
END ASC
)
FROM table_a a
WHERE ( b.C1 = a.C1 AND b.C2 = a.C2 )
OR ( b.C1 = a.C1 AND a.C2 = 'All' )
OR ( a.C1 = 'All' AND a.C2 = 'All' )
) AS Value
FROM table_b b;
结果:
C1 C2 VALUE
-- -- ----------
cc a 5
da b 4
da c 6
查询 2:
SELECT b.C1,
b.C2,
MAX ( value ) KEEP (
DENSE_RANK FIRST
ORDER BY
CASE WHEN b.C1 = a.C1 AND b.C2 = a.C2 THEN 1
WHEN b.C1 = a.C1 THEN 2
ELSE 3
END ASC
) AS Value
FROM table_b b
INNER JOIN
table_a a
ON ( b.C1 = a.C1 AND b.C2 = a.C2 )
OR ( b.C1 = a.C1 AND a.C2 = 'All' )
OR ( a.C1 = 'All' AND a.C2 = 'All' )
GROUP BY b.C1, b.C2;
查询 3:
SELECT C1,
C2,
Value
FROM (
SELECT b.C1,
b.C2,
value,
ROW_NUMBER() OVER (
PARTITION BY b.C1, b.C2
ORDER BY CASE WHEN b.C1 = a.C1 AND b.C2 = a.C2 THEN 1
WHEN b.C1 = a.C1 THEN 2
ELSE 3
END ASC
) AS RN
FROM table_b b
INNER JOIN
table_a a
ON ( b.C1 = a.C1 AND b.C2 = a.C2 )
OR ( b.C1 = a.C1 AND a.C2 = 'All' )
OR ( a.C1 = 'All' AND a.C2 = 'All' )
)
WHERE rn = 1;
所有结果都应该相同。