2012-02-24 112 views
3
SELECT p.INVOICE_PAYMENT_ID,i.INVOICE_ID,i.INVOICE_NUMBER,i.CLINIC_ID, 
    i.INVOICE_DATE,i.PAYMENT_RECEIVED_DATE, i.AMOUNT, 
    i.CURRENT_CHARGE,i.AMOUNT_RECEIVED,i.MONTH,i.YEAR,i.COMPANY_ID, 
    i.COMPANY_NAME,c.NAME,p.NOTE,i.NOTES 
FROM test1 i 
LEFT JOIN test2 c ON (i.CLINIC_ID=c.CLINIC_ID) 
LEFT JOIN test3 p ON p.INVOICE_ID=i.INVOICE_ID 
WHERE i.MONTH=11 AND i.YEAR=2011      
    AND p.INVOICE_PAYMENT_ID IN (
     SELECT MAX(INVOICE_PAYMENT_ID) 
     FROM test3 WHERE INVOICE_ID=i.INVOICE_ID 
    ) 

如果內部查詢沒有值,則它不會返回test3中的所有對應行。查詢不會返回所有預期的行

我該如何解決這個問題?

+0

如果內查詢有沒有價值則不是'test3'任何相應的行。你期望發生什麼? – ean5533 2012-02-24 12:53:29

+0

@ jinesh確實,你期望什麼? (我假設內部查詢是'max')。 – 2012-02-24 12:55:19

回答

2

where條款將你內心的查詢join條件:

SELECT p.INVOICE_PAYMENT_ID,i.INVOICE_ID,i.INVOICE_NUMBER,i.CLINIC_ID, 
    i.INVOICE_DATE,i.PAYMENT_RECEIVED_DATE, i.AMOUNT, 
    i.CURRENT_CHARGE,i.AMOUNT_RECEIVED,i.MONTH,i.YEAR,i.COMPANY_ID, 
    i.COMPANY_NAME,c.NAME,p.NOTE,i.NOTES 
FROM test1 i 
LEFT JOIN test2 c ON (i.CLINIC_ID=c.CLINIC_ID) 
LEFT JOIN test3 p ON p.INVOICE_ID=i.INVOICE_ID and p.INVOICE_PAYMENT_ID = (
     SELECT MAX(INVOICE_PAYMENT_ID) 
     FROM test3 WHERE INVOICE_ID=i.INVOICE_ID) 
WHERE i.MONTH=11 AND i.YEAR=2011 
+0

作爲一個小調整,如果你期待'test1'中的每一行總是有'test2'中的記錄(即每個發票行總是有一個'c.NAME',那麼你可能希望改變加入成爲'INNER JOIN test2 c ....',因爲它通常會稍微高效一些:) – 2012-02-24 13:32:44

0

你可以改變你的實際where子句:

... AND 
    p.INVOICE_PAYMENT_ID IN 
    (SELECT MAX(INVOICE_PAYMENT_ID) 
    FROM test3 WHERE INVOICE_ID=i.INVOICE_ID) 

由:

... AND 
(
    not exists 
    (SELECT MAX(INVOICE_PAYMENT_ID) 
    FROM test3 WHERE INVOICE_ID=i.INVOICE_ID) 
OR 
    p.INVOICE_PAYMENT_ID IN 
    (SELECT MAX(INVOICE_PAYMENT_ID) 
    FROM test3 WHERE INVOICE_ID=i.INVOICE_ID) 
) 

這將回報也TEST3如果有這種montn和條件沒有數據。