select * from Lm_Atpy_Detl l where demand_Account_No in (select demand_Account_No from Lm_Atpy_Detl where Atpy_Val_Dt='2023-04-20' and Atpy_Sts='SU' group by demand_Account_No having(count(1)>1)) and Atpy_Val_Dt='2023-04-20' and Atpy_Sts='SU' 这个sql如何使用use_hash
时间: 2023-10-27 13:05:54 浏览: 187
你可以使用以下语法在 Oracle SQL 中强制使用 Hash Join 进行查询:
```sql
SELECT /*+ USE_HASH(l) */ *
FROM Lm_Atpy_Detl l
WHERE demand_Account_No IN (SELECT demand_Account_No FROM Lm_Atpy_Detl WHERE Atpy_Val_Dt='2023-04-20' AND Atpy_Sts='SU' GROUP BY demand_Account_No HAVING COUNT(1) > 1)
AND Atpy_Val_Dt='2023-04-20'
AND Atpy_Sts='SU';
```
在上述语句中,我们向查询添加了 `/*+ USE_HASH(l) */` 提示,以强制使用 Hash Join 算法。这将覆盖 Oracle 自动优化器的默认选择,将 Hash Join 作为查询执行计划的连接方法。
请注意,在使用 `USE_HASH` 提示时,我们需要指定表别名(如 `l`),以确保提示应用到正确的表上。同时,也要注意使用这个提示并不总是能够提高查询性能,应该根据具体情况进行测试和评估。
相关问题
SELECT * FROM ( SELECT DECIDE_LEVEL_CD AS serv_grade_cd, DECIDE_LEVEL_NAME AS serv_grade_name FROM adb.BU_SE_BUYINVOICE_MAS WHERE ( (DECIDE_LEVEL_CD != '') OR (DECIDE_LEVEL_CD IS NOT NULL) ) AND ORG_CD LIKE concat('35', '%') AND BU_YEAR = ( SELECT BUSI_YEAR FROM adb.DC_PROC_BUSI_YEAR A WHERE PROC_NAME = 'P_BU_INV_ID' ) GROUP BY DECIDE_LEVEL_CD, DECIDE_LEVEL_NAME UNION SELECT DECIDE_LEVEL_CD AS CD, DECIDE_LEVEL_NAME AS NAME FROM adb.BU_SE_BUYINVOICE_DETL WHERE ( (DECIDE_LEVEL_CD != '') OR (DECIDE_LEVEL_CD IS NOT NULL) ) AND ORG_CD LIKE concat('35', '%') AND BU_YEAR = ( SELECT BUSI_YEAR FROM adb.DC_PROC_BUSI_YEAR A WHERE PROC_NAME = 'P_BU_INV_ID' ) GROUP BY DECIDE_LEVEL_CD, DECIDE_LEVEL_NAME ) aaa ORDER BY serv_grade_cd
这是一个 SQL 查询语句,目的是从两个数据表中检索出符合条件的数据,并按照 serv_grade_cd 进行排序。其中,第一个子查询从 BU_SE_BUYINVOICE_MAS 表中查询 serv_grade_cd 和 serv_grade_name,第二个子查询从 BU_SE_BUYINVOICE_DETL 表中查询 CD 和 NAME,两个子查询使用 UNION 进行合并。这个查询语句的条件是 DECIDE_LEVEL_CD 不为空或不为 '',ORG_CD 以 '35' 开头,BU_YEAR 等于一个子查询中查询出的 BUSI_YEAR。
阅读全文