两个相同的查询给出不同的结果
问题描述:
我有2个查询:一个是用ANSI SQL编写的,另一个是用oracle方言编写的。 我认为他们都必须给出相同的结果集,但这不是事实。首先查询提供了385行,第二 - 只有25两个相同的查询给出不同的结果
第一:
SELECT idclient, cl.surname, sum(sub1.s)
FROM client cl JOIN incomestatement incst USING(idclient)
JOIN (SELECT c.idincome ID, sum(inst.total) AS s
FROM instalment inst JOIN credit c USING(idcredit)
WHERE inst.paydate > c.paydate AND c.isloaned = 1
GROUP BY c.idincome) sub1 ON incst.idincome = sub1.ID
GROUP BY idclient, cl.surname;
二:
SELECT c.idclient, c.surname, sum(sub.s)
FROM client c, incomestatement inc,
(SELECT sum(inst.total) as s, cr.idincome as id
FROM instalment inst, credit cr
WHERE inst.paydate > cr.paydate AND cr.isloaned = 1 AND cr.idcredit = inst.idcredit
GROUP BY cr.idincome
) sub
WHERE c.idclient = inc.idclient AND inc.income = sub.ID
group by c.idclient, c.surname;
那么,为什么他们不给同样的结果?
答
我会逐步解决问题。
- 这两个子查询是否产生相同的数据集?
- 如果是这样,请继续执行步骤2.
- 如果不是,那么您有两个更简单的查询来分析和剖析。
- 鉴于对子查询产生相同的答案,你就可以建立客户端是否和利润表加入给出了相同的结果(把它当作另一个子查询)
- 如果他们这样做,请继续执行步骤3.
- 如果不是,则您有一对查询(一个带有JOIN,一个带有经典SQL符号)来分析和剖析。
- 鉴于连接对和子查询对都产生相同的结果,请分析为什么这些连接无法正常工作。
是的,两个子查询产生相同的数据集并且Client和IncomeStatement加入(例如:使用(idclient)从客户端加入incomestatement中选择idclient(idclient))生成相同的数据集。这些查询甚至具有相同的计划。但我不知道他们为什么给不同的数据集 – maks 2011-05-14 14:53:30
谢谢,我已经解决了这个问题。我在第二个查询inc.income = sub.ID中误认了。相反,我必须编写inc.idincome = sub.ID,因为idincome是主键 – maks 2011-05-14 15:07:10
这很奇怪......唯一的其他分解步骤是编写没有GROUP BY和SUM的最外层查询(您只需选择' sub.s'或'sub1.s'的值。这些也应该是相同的,因为你到目前为止所说的话,但这是我能看到的唯一的其他东西。**哦,你解决了它.. 。好! – 2011-05-14 15:09:05