2013-01-21 76 views
0

根據我的要求,我做了下面的查詢。現在它不工作。 查詢:語法中出現SQL錯誤,需要高效的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中有多個調查單。 Report_dt在T_INV_DTL中。所以我的結果是,如果T_INV_DTL中有報告日期而T_INV_BILL中至少有一個帳單日期,我需要結果。

如果T_INV_DTL中有報告日期而T_INV_BILL中至少有一個帳單日期(如果所有人都輸入帳單提交日期,則不需要它),那麼我需要兩者的結果。

+0

這是非常困難的「調試」您的查詢,而無需表的結構。您可以在[* sql小提琴*](http://sqlfiddle.com/#!3/6328d/1)中「創建」一個演示並向我們發送鏈接。否則,你應該運行每一個內部查詢,並確保它返回預期的結果並從那裏取得。 – alfasin

+1

'WHERE 1 T.Report_dt!='0000-00-00''應該是:'WHERE T.Report_dt!='0000-00-00'' –

+1

什麼是「Now it not working」呢?如果您沒有花時間來真實地描述問題,那麼很難幫助您解決問題。我們無法看到你的屏幕,或從我們所在的位置讀出你的想法,而「不工作」對除了你以外的每個人都沒有意義。 –

回答

0

雖然我承認不知道你有什麼問題(請提供addl信息),但你的查詢看起來好像可以優化。

刪除您在哪裏標準,並添加到您的加入應該保存表掃描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 
+0

如果T_INV_DTL中有報告日期而T_INV_BILL中至少有一個帳單日期(如果所有人都輸入了帳單提交日期,則不需要它),那麼我需要兩者的結果。 – Anu