【问题标题】:Left outer join and group by issue左外连接和按问题分组
【发布时间】:2012-10-03 13:08:28
【问题描述】:

我写了一个查询。此查询总和来自 2 个不同的表的字段。并按主表 id 字段分组。但是第二个左外连接没有分组,给了我不同的结果。

SELECT s.*,
       f.firma_adi,
       sum(sd.fiyat) AS konak,
       sum(ss.fiyat) AS sponsor
FROM   fuar_sozlesme1 s
       INNER JOIN fuar_firma_2012 f
         ON ( s.cari = f.cari )
       LEFT OUTER JOIN fuar_sozlesme1_detay sd
         ON ( sd.sozlesme_id = s.id )
       LEFT OUTER JOIN fuar_sozlesme1_sponsor ss
         ON ( ss.sozlesme_id = s.id )
GROUP  BY s.id
ORDER  BY s.id DESC 

我知道,这真的很复杂,但我坚持这个问题。 我的问题是:为什么第二个 left outer join 不是正确的字段总和。如果我删除第二个left outer join 或第一个,一切正常。

【问题讨论】:

  • 您能否简单介绍一下您的表结构,看看您有哪些列以及每个表的一行示例
  • 在派生表中进行求和和分组,然后将外部联接留在该表上。

标签: sql


【解决方案1】:

问题在于您的数据有多个维度,并且行数成倍增加,超出了您的预期。我建议您在不使用 group by 的情况下对一个 id 运行查询,以查看连接产生了哪些行。

解决此问题的一种方法是使用相关子查询:

select s.*, f.firma_adi,
       (select SUM(sd.fiyat)
        from fuar_sozlesme1_detay fd
        where sd.sozlesme_id = s.id
       ) as konak,
       (select SUM(ss.fiyat)
        from fuar_sozlesme1_sponsor ss
        where (ss.sozlesme_id = s.id)
       ) as sponsor
from fuar_sozlesme1 s inner join
     fuar_firma_2012 f
     on (s.cari = f.cari)
order by s.id DESC

顺便说一句,您似乎使用了 MySQL(因为您的查询无法用任何其他方言解析)。您应该使用您正在使用的数据库版本标记您的问题。

【讨论】:

  • @gordon 非常感谢。你的答案是我的答案的解决方案。但我删除了这一行:sum(sd.fiyat) as konak, sum(ss.fiyat) as sponsor
  • @YasinYörük 。 . .我很抱歉。我错过了那条线。
猜你喜欢
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
相关资源
最近更新 更多