查询不会返回所有预期的行
问题描述:
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
中的所有对应行。查询不会返回所有预期的行
我该如何解决这个问题?
答
从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
答
你可以改变你的实际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和条件没有数据。
如果内查询有没有价值则不是'test3'任何相应的行。你期望发生什么? – ean5533 2012-02-24 12:53:29
@ jinesh确实,你期望什么? (我假设内部查询是'max')。 – 2012-02-24 12:55:19