[英]Left Joining not returning all the records from left table
我想通過對兩個表進行join
來獲得計數,我正在做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。
為什么 Left Joining 不返回此查詢中UserTable的所有記錄?
所需 Output:
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
您需要將條件移動到ON
子句。 但是,您不需要COUNT(*)
,因為您想要計算匹配項的數量。 那將是:
SELECT UT.Name, UT.Id , COUNT(LT.UserName) as num_read
FROM UserTable UT LEFT JOIN
LogTable LT
ON LT.Username = UT.Name AND LT.Event = 'Read'
GROUP by UT.Name, UT.Id;
也就是說,這種類型的查詢通常使用相關子查詢更快:
select ut.*,
(select count(*)
from logtable lt
where lt.username = ut.name and lt.event = 'Read'
) as num_read
from usertable ut;
特別是,這可以利用logtable(username, event)
上的索引。
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
您使用WHERE LT.Event = 'Read'
這使得它成為內部連接,這就是為什么您沒有獲得左表的所有行
SELECT COUNT(*) as Read,UT.Name, UT.Id
FROM UserTable UT
LEFT JOIN LogTable LT ON LT.Username = UT.Name
and LT.Event = 'Read'
GROUP by UT.Name, UT.Id
移動 on 子句中的條件
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.