【问题标题】:SQL Joins with Example Schema带有示例架构的 SQL 连接
【发布时间】:2015-11-13 08:40:03
【问题描述】:

我有以下架构:

*Project*
ID(PK)  NAME
1       Alpha
2       Bravo
3       Charlie
4       Delta

*Employee*
ID(PK)  NAME
1       Kevin
2       Mike
3       Eric
4       Ira
5       Peter

*Project Assignment*
ID(PK)  ProjectID(FK)   EmployeeID(FK)
1       1               1
2       1               2
3       2               2
4       2               3
5       3               3
6       3               4
7       1               3

我想编写查询:

1) 显示所有分配的项目及其团队成员。

期望的输出:

Project TeamMembers
Alpha   Eric
Alpha   Kevin
Alpha   Mike
Bravo   Eric
Bravo   Mike
Charlie Eric
Charlie Ira

2) 仅显示 Alpha 项目及其团队成员,并按降序显示团队成员的姓名。

期望的输出:

ID      TeamMember
Alpha   Mike
Alpha   Kevin
Alpha   Eric

最简单的查询会是什么样子?

附加问题:

查询每个项目的团队成员数量是多少?

期望的结果:

+-------------+-------------+
| ProjectName | NumMembers |
+-------------+-------------+
| Alpha       | 3           |
| Bravo       | 2           |
| Charlie     | 2           |
+-------------+-------------+

【问题讨论】:

  • 你需要了解表关系。你的问题太模糊了。从我所见,很难实现您的查询,只是您的表关系映射很差。请以更有效的方式重新设计您的桌子。

标签: sql sql-server join


【解决方案1】:
create table Project (ID int,  NAME varchar(50));

insert into Project values
(1, 'Alpha'),
(2, 'Bravo'),
(3, 'Charlie'),
(4, 'Delta');

create table Employee (ID int,  NAME varchar(50));

insert into Employee values
(1, 'Kevin'), 
(2, 'Mike'),
(3, 'Eric'),
(4, 'Ira'),
(5, 'Peter');

create table Project_Assignment (ID int,  ProjectID int,  EmployeeID int);

insert into Project_Assignment values
(1, 1,  1),
(2, 1,  2),
(3, 2,  2),
(4, 2,  3),
(5, 3,  3),
(6, 3,  4),
(7, 1,  3);

解决方案#1:

您需要将Project_Assignment 表加入ProjectEmployee 表以分别获取您的两列:

select p.name as projectname,
       e.name as TeamMembers   
from project_assignment pa
join project p on pa.projectid = p.id
join employee e on pa.employeeid = e.id
order by projectname, TeamMembers desc;   

结果:

+-------------+-------------+
| projectname | TeamMembers |
+-------------+-------------+
| Alpha       | Mike        |
| Alpha       | Kevin       |
| Alpha       | Eric        |
| Bravo       | Mike        |
| Bravo       | Eric        |
| Charlie     | Ira         |
| Charlie     | Eric        |
+-------------+-------------+

SQL Fiddle Demo

解决方案#2:

在上述查询中添加where 子句以仅过滤Alpha 项目:

select p.name as projectname,
       e.name as TeamMembers   
from project_assignment pa
join project p on pa.projectid = p.id
join employee e on pa.employeeid = e.id
where p.name = 'Alpha'
order by projectname, TeamMembers desc;

结果:

+-------------+-------------+
| projectname | TeamMembers |
+-------------+-------------+
| Alpha       | Mike        |
| Alpha       | Kevin       |
| Alpha       | Eric        |
+-------------+-------------+

SQL Fiddle Demo 2

【讨论】:

  • 其实,我还有一个后续问题:查询会是什么样子,会显示每个项目的团队成员总数:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多