语法中出现Sql错误,需要高效的sql查询

时间:2013-01-21 04:15:17

标签: mysql sql

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

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中没有至少一个账单日期,我需要两者的结果(如果所有人都已输入提交日期,则不需要它)。

1 个答案:

答案 0 :(得分:0)

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

删除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