我是Java的学生,也做SQL。在一节课中,我们看到了一个示例数据库草图,以及一个在这个问题中复制的查询。
我用 MySql 做了一个例子,它有三个表,
CREATE TABLE `employed` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
CREATE TABLE `department` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
CREATE TABLE `employees_departments` (
`employed_id` int(11) NOT NULL,
`department_id` int(11) NOT NULL,
PRIMARY KEY (`employed_id`,`department_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
就业充满
(1 'Karl'), (2 'Bengt'), (3 'Adam'), (4 'Stefan')
部门被填满
(4, 'HR'), (5, 'Sälj'), (6, 'New departm')
employees_departments 被填满
1 4
2 5
3 4
所以“Stefan”没有部门,“新部门”没有工作。
我想要一个查询,它可以为员工提供所有部门、没有部门的员工和没有员工的部门。我找到了这样的解决方案:
select A.name, C.name from employed A
left join employees_departments B on (A.id=B.employed_id)
left join department C on (B.department_id = C.id)
union
select C.name, A.name from department A
left join employees_departments B on (A.id=B.department_id)
left join employed C on (B.employed_id = C.id)
如果有一个简短的查询来完成它会很好......
另外,我在没有外键约束的情况下做了这个,因为我想在这个例子中尽可能简单。
问候