запрос не возвращает все ожидаемые строки - PullRequest
3 голосов
/ 24 февраля 2012
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.

Как это исправить?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Переместите ваш внутренний запрос из условия 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 голосов
/ 24 февраля 2012

Вы можете изменить фактическое условие 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 также, если нет данных для этого модуля и условия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...