【问题标题】:How to join two table using jon in sql?如何在sql中使用join连接两个表?
【发布时间】:2020-04-19 04:47:00
【问题描述】:

我有两个表事件和会话,它们如下所示

events

id  sid
1   10
2   10
3   20
4   20
6   ter4
7   576

第二张桌子

sessions

id  sid
1   10
2   10
3   20
4   20
6   e21
7   b34

这是我希望从上表中看到的结果,预期结果

Total_sessions  Total_equal_sessions
7               4

现在当我运行以下查询时

SELECT sessions.sid, COUNT(*) AS Total_sessions, COUNT( sessions.sid ) AS Total_equal_sessions 
FROM events RIGHT JOIN sessions ON events.sid = sessions.sid

我得到以下结果

Total_sessions  Total_equal_sessions
7               7

我需要做什么才能得到我想要的?

【问题讨论】:

  • 请解释这些值是如何计算的。特别是,您如何获得 7 个会话?
  • COUNT(DISTINCT ...)。你现在拥有的COUNT( sessions.sid ) 相当于COUNT(*)
  • @gordon 你是什么意思我想我已经在我的问题中解释了?
  • 顺便说一句,RIGHT JOIN 应该产生 10 行,而不是 7 行。 sids 是重复的,所以所有的组合都会出现在结果中。这意味着,即使COUNT(*) 也不会是 7
  • @user9964622 发布正确的测试数据和期望的结果,并解释它的来源。现在,您要求人们从头开始创建表格,并尝试从与您所要求的数据不匹配的数据中猜测您真正想要什么。

标签: mysql sql sql-server select


【解决方案1】:
COUNT(sessions.sid)

将简单地计算 sid 不为空的所有行。你可能想要:

COUNT(DISTINCT sessions.sid)

此外,您似乎在 events 表中的 sid 不在 session 表 (ter4) 中,反之亦然 - 右连接将排除在 session 中没有相应条目的事件中的行 - 这就是您想要的吗?

【讨论】:

    【解决方案2】:

    您需要更多数据来计算匹配的 sid - 在本例中,我使用了生成的行号。总会话似乎是第二个表中的最大 id。

    drop table if exists t,t1;
    create table t
    (id int, sid varchar(10));
    insert into t values
    (1  , '10'),
    (2  , '10'),
    (3  , '20'),
    (4  , '20'),
    (6  , 'ter4'),
    (7  , '576');
    
    create table t1
    (id int, sid varchar(10));
    insert into t1 values
    (1  , '10'),
    (2  , '10'),
    (3  , '20'),
    (4  , '20'),
    (6  , 'A'),
    (7  , 'b');
    
    select (select max(id) from t1) sessions,sum(case when t1.sid1 = t.sid and t1.rn1 = t.rn then 1 else 0 end) matched
    from
    (select sid,row_number() over (partition by sid order by sid) rn from t) t
    right join
    (select sid sid1,row_number() over (partition by sid order by sid) rn1 from t1) t1
    on t1.sid1 = t.sid and t1.rn1 = t.rn
    
    
    +----------+---------+
    | sessions | matched |
    +----------+---------+
    |        7 |       4 |
    +----------+---------+
    1 row in set (0.00 sec)
    

    【讨论】:

      【解决方案3】:

      您可以使用左连接,左侧表中的 count(id) 将返回 Total_sessions,右侧表中的 count(id) 将返回所有非空值的计数,在这种情况下,所有匹配的值两张表。

      这是一个例子

      create table #events(id int, sid varchar(10))
      create table #sessions(id int, sid varchar(10))
      
      insert #events
      select * from (values(1,'10'),(2,'10'),(3,'20'),(4,'20'),(5,'abc'),(6,'ter4'),(7,'576')) a(id,sid)
      
      insert #sessions
      select * from (values(1,'10'),(2,'10'),(3,'20'),(4,'20'),(5,'xyz'),(6,'e21'),(7,'b34')) a(id,sid)
      
      select count(e.id) Total_sessions, count(s.id) Total_equal_sessions
        from #events e left join
             #sessions s on e.id = s.id and e.sid = s.sid
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-16
        • 2013-06-30
        • 2022-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多