0

根据我的要求,我进行了以下查询。现在它不起作用。查询是:

SELECT *
FROM   T_INV_DTL T
       LEFT JOIN (
                SELECT inv_dtl_id,
                       Employee_id AS emp_id,
                       GROUP_CONCAT(DISTINCT Employee_id) AS Employee_id
                FROM   T_INV_INVESTIGATOR
                GROUP BY
                       inv_dtl_id
            )TII
            ON  T.inv_dtl_id = TII.inv_dtl_id
       JOIN T_INVESTIGATION TI
            ON  T.inv_id = TI.inv_id
       LEFT JOIN (
                SELECT inv_dtl_id
                FROM   T_INV_BILL
                GROUP BY
                       inv_dtl_id
            )TIB
            ON  T.inv_dtl_id = TIB.inv_dtl_id
       JOIN T_Insurance_company TIC
            ON  TI.client_id = TIC.ins_cmp_id
WHERE  1 T.Report_dt != '0000-00-00'
       AND (
               T.inv_dtl_id NOT IN (SELECT inv_dtl_id
                                    FROM   T_INV_BILL TIBS
                                    WHERE  TIBS.inv_dtl_id NOT IN (SELECT 
                                                                          inv_dtl_id
                                                                   FROM   
                                                                          T_INV_BILL
                                                                   WHERE  
                                                                          Bill_submitted_dt = 
                                                                          '0000-00-00'))
           )
ORDER BY
       Allotment_dt DESC 
       LIMIT 20

任何人都可以告诉问题,请您修改为更有效的查询(假设如果我们有超过 100 条记录,那么我们对其进行计数以进行分页应该更快)。

T_INV_DTL 是主表,它连接到其他表。所以我的问题是这个表T_INV_DTL的每个条目在表T_INV_BILL中有多个调查账单。T_INV_DTL 中的 Report_dt。所以我的结果是,如果 T_INV_DTL 中有报告日期,并且 T_INV_BILL 中没有至少一个账单日期,我需要结果。

如果 T_INV_DTL 中有报告日期并且 T_INV_BILL 中没有至少一个账单日期,我需要两者的结果(如果所有人都输入了账单提交日期,则不需要它)。

4

1 回答 1

0

虽然我承认不知道您遇到了什么问题(请提供附加信息),但您的查询看起来确实可以优化。

删除您的 Where 条件并添加到您的 Join 应该保存 2 个表扫描:

SELECT *
FROM   T_INV_DTL T
       LEFT JOIN (
                SELECT inv_dtl_id,
                       Employee_id AS emp_id,
                       GROUP_CONCAT(DISTINCT Employee_id) AS Employee_id
                FROM   T_INV_INVESTIGATOR
                GROUP BY
                       inv_dtl_id
            )TII
            ON  T.inv_dtl_id = TII.inv_dtl_id
       JOIN T_INVESTIGATION TI
            ON  T.inv_id = TI.inv_id
       LEFT JOIN (
                SELECT inv_dtl_id
                FROM   T_INV_BILL
                WHERE Bill_submitted_dt != '0000-00-00'
                GROUP BY inv_dtl_id
            )TIB
            ON  T.inv_dtl_id = TIB.inv_dtl_id
       JOIN T_Insurance_company TIC
            ON  TI.client_id = TIC.ins_cmp_id
WHERE  T.Report_dt != '0000-00-00' 
    AND TIB.inv_dtl_id IS NULL
ORDER BY
       Allotment_dt DESC 
       LIMIT 20
于 2013-01-21T04:55:22.550 回答