SELECT * FROM formtable_main_203 a,formtable_main_419 b WHERE a.REQUESTID IN (SELECT * FROM workflow_requestoperatelog WHERE OPERATORID ='65759' AND OPERATECODE = '5') OR b.REQUESTID IN (SELECT REQUESTID FROM workflow_requestoperatelog WHERE OPERATORID ='65759' AND OPERATECODE = '5') 优化此sql
时间: 2023-12-10 15:38:33 浏览: 183
这个 SQL 查询可以使用 INNER JOIN 连接表 a 和 b,而不是使用 WHERE 子句中的两个表的交集。此外,IN 子句也可以被替换为 EXISTS 子句,这通常会更有效率。最后,如果可能的话,应该避免使用 SELECT *,而应该显式指定所需的列。
因此,可以使用以下 SQL 优化原始查询:
```
SELECT a.*, b.*
FROM formtable_main_203 a
INNER JOIN formtable_main_419 b ON a.REQUESTID = b.REQUESTID
WHERE EXISTS (
SELECT 1 FROM workflow_requestoperatelog
WHERE REQUESTID = a.REQUESTID OR REQUESTID = b.REQUESTID
AND OPERATORID = '65759' AND OPERATECODE = '5'
)
```
这个查询使用 INNER JOIN 连接表 a 和 b,并使用 EXISTS 子句替换了 IN 子句。同时,它只选择所需的列,而不是使用 SELECT *。
相关问题
SELECT LCBH FROM formtable_main_203 where REQUESTID IN (SELECT REQUESTID FROM workflow_requestoperatelog WHERE OPERATORID = '65759' AND OPERATECODE = '5') union SELECT LCBH FROM formtable_main_419 where REQUESTID IN (SELECT REQUESTID FROM workflow_requestoperatelog WHERE OPERATORID = '65759' AND OPERATECODE = '5') 优化此sql
可以尝试将子查询改为使用 JOIN 操作,避免使用子查询:
```
SELECT LCBH
FROM (
SELECT REQUESTID, LCBH
FROM formtable_main_203
UNION
SELECT REQUESTID, LCBH
FROM formtable_main_419
) t1
JOIN workflow_requestoperatelog t2 ON t1.REQUESTID = t2.REQUESTID
WHERE t2.OPERATORID = '65759' AND t2.OPERATECODE = '5'
```
此外,如果需要加速查询,可以考虑对操作日志表 workflow_requestoperatelog 的 OPERATORID 和 OPERATECODE 字段加上索引。
update formtable_main_157 set spr=(SELECT string_agg(a1.lastname,',') FROM ( SELECT a.requestid, a.userid, b.lastname lastname FROM workflow_currentoperator a JOIN hrmresource b ON a.userid=b.id WHERE a.requestid=$requestid$ and a.nodeid=484 ) as a1 ) where requestid=$requestid$ 检查这个语句的错误并改正
这个 SQL 语句看起来是更新 `formtable_main_157` 表中的 `spr` 字段,其中 `spr` 字段的值应该是从 `workflow_currentoperator` 和 `hrmresource` 两个表中查询得到的。其中,`workflow_currentoperator` 表中记录了流程中当前操作者的信息,`hrmresource` 表中记录了人员信息。具体来说,SQL 语句的实现思路是:
1. 查询 `workflow_currentoperator` 表中 `requestid` 值为 `$requestid$`,`nodeid` 值为 `484` 的所有记录,得到这些记录的 `userid` 列表。
2. 根据 `userid` 列表,查询 `hrmresource` 表中对应的 `lastname` 列表。
3. 将 `lastname` 列表中的所有值拼接成一个字符串,并将该字符串更新到 `formtable_main_157` 表中 `requestid` 值为 `$requestid$` 的记录的 `spr` 字段中。
根据上述描述,可以尝试修改 SQL 语句如下:
```
UPDATE formtable_main_157
SET spr = (
SELECT string_agg(b.lastname, ',')
FROM workflow_currentoperator a
JOIN hrmresource b ON a.userid = b.id
WHERE a.requestid = $requestid$ AND a.nodeid = 484
)
WHERE requestid = $requestid$;
```
这里使用了 `JOIN` 语句将 `workflow_currentoperator` 表和 `hrmresource` 表连接起来,同时使用了 PostgreSQL 特有的 `string_agg` 函数来将 `lastname` 列表中的值拼接成一个字符串。
阅读全文