这是一个只访问表一次,但使用解析函数的解决方案:
WITH testtable AS (SELECT 'AAA' field1, 'BBB' field2, 1234 field3 FROM dual UNION ALL
SELECT 'AAA' field1, 'BCB' field2, 1234 field3 FROM dual UNION ALL
SELECT 'AAA' field1, 'ABB' field2, 1234 field3 FROM dual UNION ALL
SELECT 'AAA' field1, 'BDB' field2, 9999 field3 FROM dual UNION ALL
SELECT 'AAA' field1, 'SDD' field2, 1234 field3 FROM dual UNION ALL
SELECT 'BBB' field1, 'BDB' field2, 9999 field3 FROM dual UNION ALL
SELECT 'CCC' field1, 'BBB' field2, 1234 field3 FROM dual UNION ALL
SELECT 'CCC' field1, 'BCB' field2, 1234 field3 FROM dual UNION ALL
SELECT 'CCC' field1, 'ABB' field2, 1234 field3 FROM dual UNION ALL
SELECT 'CCC' field1, 'SDD' field2, 1234 field3 FROM dual)
SELECT field1,
field2,
field3
FROM (SELECT field1,
field2,
field3,
COUNT(CASE WHEN field3 != 9999 THEN field3 END) OVER (PARTITION BY field1) cnt_non_default
FROM testtable)
WHERE field3 != 9999
OR cnt_non_default = 0;
FIELD1 FIELD2 FIELD3
------ ------ ----------
AAA BBB 1234
AAA BCB 1234
AAA ABB 1234
AAA SDD 1234
BBB BDB 9999
CCC BBB 1234
CCC BCB 1234
CCC ABB 1234
CCC SDD 1234
这可能会或可能不会比访问该表两次或更多次的其他建议答案更有效 - 您需要针对您的表和(适当数量的)数据进行测试,看看哪个最适合您。