内部联接与数据库中的两个表

时间:2013-12-26 19:02:55

标签: sql database oracle aggregate-functions

我在sql中有2个表,我正在进行查询:

在第一个查询中我正在计算日期数据

在secont查询中,我计算的是同一日期的数据

在3查询中,我正在进行内连接,但我需要显示查询中的数据

20101120    26   19

但我有:

20101120    313 313

我的例子是:

http://sqlfiddle.com/#!4/e61fc/2

谁能帮帮我?

有什么问题?

我可以通过加入来实现吗?

或问题是加入?

3 个答案:

答案 0 :(得分:1)

SELECT  A.id_date_sus AS id_date,
        A.N1,
        B.N2
FROM (SELECT id_date_sus, 
             COUNT(id_date_sus) AS N1
      FROM suscription
      GROUP BY id_date_sus) A
LEFT JOIN (SELECT id_date, 
                  COUNT(id_date) AS N2
           FROM billing
           GROUP BY id_date) B
  ON A.id_date_sus = B.id_date;

答案 1 :(得分:0)

如果您使用oracle db,您可以执行以下操作:

with s1 as
(select id_date_sus, count(id_date_sus) c1
from suscription
group by id_date_sus),

s2 as
(select id_date, count(id_date) c2
from billing
group by id_date)

select s1.id_date_sus, s1.c1, s2.c2 from s1, s2 where s1.id_date_sus = s2.id_date

答案 2 :(得分:0)

问题在于您的数据。每个表中只有两个服务。

所以

 (s.id_service = b.id_service and 
  b.id_date = s.id_date_sus) 

未加入唯一键。

当发生这种情况时,我们会得到一个笛卡尔积,其中连接一侧的每条记录都与连接另一侧的每条记录配对。对于产生(19 * 15)行的service_id=1;用于产生(4 * 7)行的service_id=2。现在,285 + 28 = 313,这解释了麻烦你的计数。

解决方案是将两个计数作为单独的子查询运行,然后将它们连接到主查询中:

select s.id_date_sus, s.cnt as s_cnt, b.cnt as b_cnt 
from 
    ( select s.id_date_sus, count(*) cnt
      from suscription s
      group by s.id_date_sus) s
    join ( select b.id_date, count(*) cnt
           from billing b 
           group by b.id_date) b
    on (s.id_date_sus = b.id_date);

这是my re-work of your SQL Fiddle