如何解决选择连接时值为空的Mysql
CREATE TABLE IF NOT EXISTS `department` (
`id` INT NOT NULL,`name` VARCHAR(45) NOT NULL,`father` INT NULL,PRIMARY KEY (`id`),INDEX `fk_department_department_idx` (`father` ASC) VISIBLE,CONSTRAINT `fk_department_department`
FOREIGN KEY (`father`)
REFERENCES `department` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `print` (
`id` INT NOT NULL,`page` INT NOT NULL,`copy` INT NOT NULL,`date` DATE NOT NULL,`department` INT NULL,INDEX `fk_print_department1_idx` (`department` ASC) VISIBLE,CONSTRAINT `fk_print_department1`
FOREIGN KEY (`department`)
REFERENCES `department` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
insert into department (id,name,father)
values
(1,'dp1',null),(2,'dp2',(3,'dp3',1),(4,'dp4',2);
insert into print (id,page,copy,date,department)
values
(1,2,3,'2020-1-11',1,6,'2020-1-12',4),4,5,'2020-1-13',(5,'2020-1-15',(6,(7,(8,'2020-1-16',4);
select
d.name as department,f.name as father,sum_print as sum
from
department d
left join department f on f.id = d.father
left join
(
select
department,sum(page*copy) as sum_print
from print
where date between CAST('2020-1-13' AS DATE)
AND CAST('2020-1-15' AS DATE)
group by department
) as tmp on tmp.department = d.id;
我得到的结果是。
| department | father | sum |
| dp1 | null | 24 |
| dp2 | null | null |
| dp3 | dp1 | null |
| dp4 | dp2 | null |
我需要的是以下内容。
| department | father | sum |
| dp1 | null | 24 |
| dp2 | null | null |
| dp3 | dp1 | null |
| dp4 | dp2 | null |
| null | null | 35 |
由于某种原因,我无法弄清楚,我错过了最后一个元组。我认为是因为加入了as tmp on tmp.department = d.id
在所有想要使用它并且/或者可以帮助的人中关注小提琴:here
我尝试了以下帖子,但没有运气。我现在卡住了。
- Fiddle
- mysql-select-join-with-empty-row-returns
- mysql-inner-join-with-possible-empty-fields
- mysql-how-to-return-rows-even-if-join-data-is-empty
解决方法
您真正需要的是2个查询的完全外部联接。
问题在于MySql(仍然)不支持这种联接,因此必须使用左右联接模拟所有联接:
with
d as (
select d.id,d.name as department,f.name as father
from department d left join department f
on f.id = d.father
),p as (
select department,sum(page*copy) as sum_print
from print
where date between CAST('2020-1-13' AS DATE) AND CAST('2020-1-15' AS DATE)
group by department
)
select d.department,d.father,p.sum_print
from d left join p
on p.department = d.id
union all
select d.department,p.sum_print
from d right join p
on p.department = d.id
where d.id is null
请参见demo。
结果:
> department | father | sum_print
> :--------- | :----- | --------:
> dp1 | null | 24
> dp2 | null | null
> dp3 | dp1 | null
> dp4 | dp2 | null
> null | null | 35
,
这将为您提供所需的外部连接结果
uid
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。