这是我需要实现的目标:
person_id last_name first_name region_id region name
1 barnum phineas 1 maricopa
2 loman willy 2 pima
2 loman willy 3 pinal
2 loman willy 4 santa cruz
3 kay mary 5 cochise
3 kay mary 6 gila
3 kay mary 7 graham
4 lillian vernon NULL NULL
以下是我的表格:
Create database sales
use sales
create table if not exists
`Sales_People`
(`person_id` int primary key,
`last_name` char(16) not null,
`first_name` char(16) not null);
INSERT INTO Sales_people
(`person_id`, `last_name`, `first_name`)
values
('1', 'barnum', 'phineas'),
('2', 'loman', 'willy'),
('3', 'kay', 'mary'),
('4', 'lillian', 'vernon');
create table if not exists
`Sales_Region`
(`region_id` int primary key,
`name` char(16) not null);
INSERT INTO Sales_Region
(`region_id`, `name`)
Values
('1', 'maricopa'),
('2', 'pima'),
('3', 'pinal'),
('4', 'santa cruz'),
('5', 'cochise'),
('6', 'gila'),
('7', 'graham');
create table if not exists
`Sales_People_Region`
(`person_id` int not null,
`region_id` int not null,
constraint spr_pk primary key(person_id, region_id),
constraint spr_fk1 foreign key(person_id)
references Sales_People(person_id),
constraint spr_fk2 foreign key(region_id)
references Sales_Region(region_id));
INSERT INTO Sales_People_Region
(`person_id`, `region_id`)
Values
('1', '1'),
('2', '2'),
('2','3'),
('2', '4'),
('3', '5'),
('3', '6'),
('3','7');
create table if not exists
`Sales`
(`year` int not null,
`month` int not null,
`region_id` int not null,
`amount_sold` decimal(11,2),
constraint s_pk primary key(year, month, region_id),
constraint s_fk foreign key(region_id)
references Sales_Region(region_id));
INSERT INTO Sales
(`year`, `month`, `region_id`, `amount_sold`)
Values
('2016', '01', '1', '800000'),
('2016', '02', '1', '850000'),
('2016', '03', '1', '990000'),
('2016', '01', '2', '425000'),
('2016', '02', '2', '440000'),
('2016', '03', '2', '450000'),
('2016', '01', '3', '200000'),
('2016', '02', '3', '210000'),
('2016', '03', '3', '220000'),
('2016', '01', '4', '50000'),
('2016','02', '4', '52000'),
('2016', '03', '4', '55000'),
('2016', '01', '5', '40000'),
('2016', '02', '5', '41000'),
('2016', '03', '5', '42000'),
('2016', '01', '6', '3000'),
('2016', '02', '6', '31000'),
('2016','03', '6', '32000'),
('2016', '01', '7', '20000'),
('2016', '02', '7', '21000'),
('2016', '03', '7', '22000');
这是我的代码:
select sales_people.person_id, `last_name`, `first_name`, sales_region.Region_id,
trim(sales_region.`name`) AS 'Region Name'
from `sales_region`
inner join sales_people_region
on sales_people_region.region_id = sales_region.region_id
inner join sales_people
on sales_people_region.`person_id` = sales_people.`person_id`
group by sales_region.region_id, sales_people.person_id
having sales_people.person_id >= ''
order by sales_people.person_id, sales_region.region_id asc;
我得到了什么:
person_id last_name first_name Region_id "Region Name"
1 barnum phineas 1 maricopa
2 loman willy 2 pima
2 loman willy 3 pinal
2 loman willy 4 "santa cruz"
3 kay mary 5 cochise
3 kay mary 6 gila
3 kay mary 7 graham
我无法让它看到最后一个person_id,因为它们没有分配region_ids。在表中,sales_people_region region_id是主键,因此不能为null。
如果我按person_id查询sales_people和group,那么她确实会出现。
答案 0 :(得分:0)
我认为外部联接可以解决这个问题。内连接要求在连接的每一侧至少存在一行;左外连接将从左侧表中选择所有行,包括右侧表中没有匹配行的那些。 (右外连接是此镜像,完整外连接选择两侧不匹配的行。)
尝试此查询:
SELECT sales_people.person_id, last_name, first_name, sales_region.Region_id,
TRIM(sales_region.`name`) AS 'Region Name'
FROM sales_people
LEFT OUTER JOIN sales_people_region
on sales_people.person_id = sales_people_region.person_id
LEFT OUTER JOIN sales_region
ON sales_people_region.region_id = sales_region.region_id
GROUP BY sales_region.region_id, sales_people.person_id
HAVING sales_people.person_id != ''
ORDER BY sales_people.person_id, sales_region.region_id ASC;