4Manuals

  • PDF Cloud HOME

如何在SQL中使用Jon联接两个表? Download

    如何将字符串“ text1”设置为包含项目text1,text2,test3的组合框的选定项目? 转换后的SELECT下拉列表(以ul为单位)不会显示在SAFARI XML数据类型方法“值”的参数1必须是字符串文字 当使用pyodbc时,SQL Server DateTimeOffset将可识别tz的日期时间的偏移更改为系统偏移 如何在python中使用sql查询生成文本文件? 是否可以在不连接数据库的情况下在sql中打开.bak文件? 选择前10k花费太多时间来执行 为什么需要在MySQL中引用表名`5e09c9c09e9ba0cceccb3701`? 如何清洁先前设置的间隔? 为什么我在php中的mysqli查询不起作用

我有两个表事件和会话,它们看起来像下面的

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

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

3 个答案:

答案 0 :(得分:3)

COUNT(sessions.sid)

将仅计算sid不为null的所有行。您可能想要:

COUNT(DISTINCT sessions.sid)

此外,您似乎在会话表(ter4)中没有的事件表中有sid,反之亦然-正确的连接将从事件中没有相应条目的事件中排除行-这就是您想要的吗?</

答案 1 :(得分:1)

您需要更多数据来计算匹配的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)

答案 2 :(得分:0)

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

这是一个例子

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



Similar searches
    保持关闭周期 如何从JSON中的对象数组中提取对象? 为什么我的Web Api(完整框架)项目不会生成Xml文档文件 在cte的返回部分中使用交叉联接中的列别名 DDD-更改汇总内的实体