我目前正在使用一个SQL查询,该查询从具有20列的复杂SQL视图中读取数据。我应该使用8 where条件读取数据。在这8个条件中,一个条件是可选的。这意味着,如果没有满足所有这8个条件的匹配记录,则忽略该可选where条件并返回结果。
这是进一步解释此问题的示例:
表格:: EMPLOYEE_DETAILS
EMP_NO EMP_NAME EMP_DEPT_NO PREF_LANGUAGE LOCATION
------ -------- ----------- ------------- ---------
1 Name1 101 ENGLISH USA
2 Name2 102 SPANISH SPAIN
3 Name3 103 ENGLISH USA
4 Name4 102 ITALIAN ITALY
5 Name5 103 ENGLISH USA
6 Name6 103 ITALIAN ITALY
查询:
SELECT * FROM EMPLOYEE_DETAILS
WHERE EMP_DEPT_NO = 103 AND LOCATION ='USA' AND PREF_LANGUAGE = 'SPANISH'
在此示例sql查询中,PREF_LANGUAGE条件是可选的。
如果存在所有三个条件都匹配的记录,则仅返回那些匹配的记录。由于上表没有与所有三个条件都匹配的记录,因此查询应省略可选条件(即PREF_LANGUAGE),并得出与其余两个必需条件匹配的记录。
非常感谢您的帮助。
谢谢
我想我会对查询进行如下调整:
WITH cte AS (
SELECT ed.*,
SUM(CASE WHEN PREF_LANGUAGE = 'SPANISH' THEN 1 ELSE 0 END) OVER () as NUM_PREF_SPANISH
FROM EMPLOYEE_DETAILS ed
WHERE EMP_DEPT_NO = 103 AND LOCATION = 'USA'
)
SELECT *
FROM cte
WHERE PREF_LANGUAGE = 'SPANISH' OR
NUM_PREF_LANGUAGE = 0;
用这种方式表述的原因是Oracle并不总是实现CTE。这样可以保证CTE仅被引用一次,因此优化程序不会多次运行复杂的代码。
您还可以使用WITH TIES
技巧在最新版本的Oracle中执行此操作:
SELECT ed.*,
FROM EMPLOYEE_DETAILS ed
WHERE EMP_DEPT_NO = 103 AND LOCATION = 'USA'
ORDER BY(CASE WHEN PREF_LANGUAGE = 'SPANISH' THEN 1 ELSE 2 END)
FETCH FIRST 1 ROW WITH TIES;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句