我想通过这样做来获得计数 join
有了这两张table,我正在做什么 group by
以及 left join
.
但是如果那条记录与另一个表不匹配,我就不会得到所有的行。
在给定的查询中:
create table UserTable (
Id integer not null,
Name varchar(12) not null
);
insert into UserTable values (1, 'A B');
insert into UserTable values (2, 'A C');
insert into UserTable values (3, 'A C A C');
insert into UserTable values (4, 'A C C');
insert into UserTable values (5, 'A C B');
insert into UserTable values (6, 'A C C');
insert into UserTable values (7, 'A C D');
insert into UserTable values (8, 'A C E');
insert into UserTable values (9, 'A C F');
create table LogTable (
LogId integer not null,
Username varchar(12) not null,
Event varchar(12) not null
);
insert into LogTable values (1, 'A C A C', 'Read');
insert into LogTable values (2, 'A C F', 'Write');
insert into LogTable values (3, 'A C F', 'Read');
insert into LogTable values (4, 'A C C', 'Update');
insert into LogTable values (5,'A C C', 'Read');
insert into LogTable values (6,'A C F', 'Read');
insert into LogTable values (7,'A C F', 'Update');
insert into LogTable values (7,'A C F', 'Write');
insert into LogTable values (7,'A C E','Update');
insert into LogTable values (7,'A C F', 'Delete');
insert into LogTable values (10,'A C B', 'Delete');
insert into LogTable values (11, 'A C F','Copy');
insert into LogTable values (12, 'A C B','Read');
insert into LogTable values (13, 'A C F','Update');
insert into LogTable values (14, 'A C F','Copy');
insert into LogTable values (15, 'A C F','Read');
insert into LogTable values (16, 'A C F','Update');
insert into LogTable values (17, 'A C F','Copy');
insert into LogTable values (18, 'A C C','Read');
insert into LogTable values (19, 'A C D','Update');
我在做:
SELECT COUNT(*) as Read,UT.Name, UT.Id
FROM UserTable UT
LEFT JOIN LogTable LT ON LT.Username = UT.Name
WHERE LT.Event = 'Read'
GROUP by UT.Name, UT.Id
我要的是从 UserTable
,如果在 LogTable
如果不存在 ReadCount
作为0。
为什么在这个查询中没有从usertable返回所有记录?
期望输出:
Id | Name | ReadCount
-----------------------------
1 | A B | 0
2 | A C | 0
3 | A C A C | 1
4 | A C C | 2
5 | A C B | 1
6 | A C C | 2
7 | A C D | 0
8 | A C E | 0
9 | A C F | 3
2条答案
按热度按时间vbopmzt11#
你需要把条件转移到
ON
条款。但是,你不想COUNT(*)
因为你想计算匹配的数量。那就是:也就是说,使用相关子查询时,这种查询通常更快:
特别是,这可以利用
logtable(username, event)
.bxpogfeg2#
你曾经
WHERE LT.Event = 'Read'
这使得它是内部连接,这就是为什么你没有得到左表的所有行移动on子句中的条件