2012-02-24 3 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

+0

本当に、あなたは何を期待していますか? (内側のクエリは 'max'を持つものと仮定します)。 –

答えて

2
join状態に where句から、あなたの内側のクエリを移動し

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 ....'に参加すると、一般的に少し効率的に実行されます:) –

0

あなたが変更することができ、あなたの実際のwhere句:

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

によって:このmontnと条件のデータがない場合、これは戻ってもTEST3ます

... 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) 
) 

関連する問題