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はメインテーブルであり、他のテーブルに接続します。したがって、私のprobelmは、このテーブルT_INV_DTLの各エントリであり、テーブルT_INV_BILLに複数の調査請求書があります。T_INV_DTLのReport_dt。したがって、私の結果は、T_INV_DTLにレポート日があり、T_INV_BILLに少なくとも1つの請求日がない場合、結果が必要になるということです。

T_INV_DTLにレポート日があり、T_INV_BILLに少なくとも1つの請求日がない場合は、両方の結果が必要です(すべての請求日が入力されている場合は、それは必要ありません)。

4

1 に答える 1

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
于 2013-01-21T04:55:22.550 に答える