为什么Firebird 3不能执行where in?

问题描述 投票:0回答:1

当执行下面的代码时,它会一直思考并最终导致fastreport崩溃,为什么?

SELECT TREQDEVMAT.COD_PRODUTO,
       TPRODUTO.DES_PRODUTO,
       TPRODUTO.COD_SUBFAMILIA,
       TPRODUTOIDIOMA.DES_PRODUTO AS DES_PRODUTO_IDIOMA,
       TREQDEVMAT.NUM_CHAVEOP,
       (TREQDEVMAT.QTD_REQUISITADA / TORDEMPROD.QTD_PRODUZIR) AS QTD_POREQUIP,
       TPRODUTO.FLG_ASSISTTEC,
       TPRODUTO.VAL_ULTCUSTOMOV,
       TPRODUTO.DAT_ULTCOMPRA
FROM TREQDEVMAT
LEFT JOIN TPRODUTO ON TPRODUTO.COD_PRODUTO = TREQDEVMAT.COD_PRODUTO
LEFT JOIN TORDEMPROD ON TORDEMPROD.NUM_CHAVE = TREQDEVMAT.NUM_CHAVEOP
LEFT JOIN TPRODUTOIDIOMA ON TPRODUTOIDIOMA.COD_PRODUTO = TREQDEVMAT.COD_PRODUTO
WHERE TREQDEVMAT.NUM_CHAVEOP IN (
    SELECT tordemprod.NUM_CHAVE
    FROM tmrp
    LEFT JOIN tordemprod ON tordemprod.NUM_CHMRP = tmrp.NUM_CHAVE
    WHERE TRIM(NUM_MRP) = '1354'
)
AND TPRODUTO.FLG_ASSISTTEC = 1
AND TPRODUTOIDIOMA.COD_IDIOMA = 1
AND TREQDEVMAT.COD_EMPRESA = 1
AND (TPRODUTO.COD_SUBFAMILIA NOT LIKE 'CE-UM' OR TPRODUTO.COD_SUBFAMILIA = 'CM-FP')
ORDER BY TREQDEVMAT.COD_PRODUTO ASC
firebird fastreport firebird-3.0
1个回答
0
投票

您的子查询包含不能使用索引的条件。它使得用于该查询的嵌套循环极其无效。由于执行结果时间非常长。

您的查询还包含逻辑错误:子查询中的条件重复联接中的条件,这使情况变得更糟。

Fast Report 的崩溃与这一切无关,很可能是查询返回大量记录的结果。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.