左前生成每个Item_Number
值的总和左表联接返回行,并在左边的表的每一行,在右边的表中的所有匹配的行。
因此,例如:
create table Customers (name varchar(50));
insert Customers values
('Tim'),
('John'),
('Spike');
create table Orders (customer_name varchar(50), product varchar(50));
insert Orders values (
('Tim', 'Guitar'),
('John', 'Drums'),
('John', 'Trumpet');
create table Addresses (customer_name varchar(50), address varchar(50));
insert Addresses values (
('Tim', 'Penny Lane 1'),
('John', 'Abbey Road 1'),
('John', 'Abbey Road 2');
然后,如果你运行:
select c.name
, count(o.product) as Products
, count(a.address) as Addresses
from Customers c
left join Orders o on o.customer_name = c.name
left join Addresses a on a.customer_name = c.name
group by name
你得到:
name Products Addresses
Tim 1 1
John 4 4
Spike 0 0
但约翰没有4级的产品!
如果没有group by
运行,你可以看到为什么计数是关闭:
select *
from Customers c
left join Orders o on o.customer_name = c.name
left join Addresses a on a.customer_name = c.name
你得到:
name customer_name product customer_name address
Tim Tim Guitar Tim Penny Lane 1
John John Drums John Abbey Road 1
John John Drums John Abbey Road 2
John John Trumpet John Abbey Road 1
John John Trumpet John Abbey Road 2
Spike NULL NULL NULL NULL
正如你所看到的,加入最终重复对方。对于每个产品,重复地址列表。这给你错误的数字。为了解决这个问题,使用优秀的其他答案之一:
select c.name
, o.order_count
, a.address_count
from Customers c
left join
(
select customer_name
, count(*) as order_count
from Orders
group by
customer_name
) o
on o.customer_name = c.name
left join
(
select customer_name
, count(*) as address_count
from Addresses
group by
customer_name
) a
on a.customer_name = c.name
子查询确保只有一行每个客户加入。结果好多了:
name order_count address_count
Tim 1 1
John 2 2
Spike NULL NULL
finnaly解决我的问题:)谢谢先生! – 2013-02-25 14:00:40