两个相同的查询给出不同的结果

问题描述:

我有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; 

那么,为什么他们不给同样的结果?

我会逐步解决问题。

  1. 这两个子查询是否产生相同的数据集?
    • 如果是这样,请继续执行步骤2.
    • 如果不是,那么您有两个更简单的查询来分析和剖析。
  2. 鉴于对子查询产生相同的答案,你就可以建立客户端是否和利润表加入给出了相同的结果(把它当作另一个子查询)
    • 如果他们这样做,请继续执行步骤3.
    • 如果不是,则您有一对查询(一个带有JOIN,一个带有经典SQL符号)来分析和剖析。
  3. 鉴于连接对和子查询对都产生相同的结果,请分析为什么这些连接无法正常工作。
+0

是的,两个子查询产生相同的数据集并且Client和IncomeStatement加入(例如:使用(idclient)从客户端加入incomestatement中选择idclient(idclient))生成相同的数据集。这些查询甚至具有相同的计划。但我不知道他们为什么给不同的数据集 – maks 2011-05-14 14:53:30

+0

谢谢,我已经解决了这个问题。我在第二个查询inc.income = sub.ID中误认了。相反,我必须编写inc.idincome = sub.ID,因为idincome是主键 – maks 2011-05-14 15:07:10

+0

这很奇怪......唯一的其他分解步骤是编写没有GROUP BY和SUM的最外层查询(您只需选择' sub.s'或'sub1.s'的值。这些也应该是相同的,因为你到目前为止所说的话,但这是我能看到的唯一的其他东西。**哦,你解决了它.. 。好! – 2011-05-14 15:09:05

你提交了吗? 有可能你没有进行一些交易,所以结果可能不同。

+0

不,问题不在提交。我在启动数据库后运行了这些查询。 – maks 2011-05-14 14:11:54