SQL 多对多查询

表Task:taskID,taskName表Person:personID,personName表TaskPerson:taskID,personID每个任务有多个人担当... 表Task: taskID,taskName
表Person: personID, personName
表TaskPerson: taskID,personID
每个任务有多个人担当,每个人同时也担当多人任务。
求教SQL文,查询1:每个任务对应的担当者
查询2:每个人承担的任务
谢谢!
展开
 我来答
freechan10
2020-02-05 · TA获得超过2.9万个赞
知道小有建树答主
回答量:263
采纳率:68%
帮助的人:12.6万
展开全部

1、创建测试表,

create table test_task(taskID varchar2(20),taskName varchar2(200));

create table test_person(personID varchar2(20),personName varchar2(200));

create table test_task_person(taskID varchar2(20),personID varchar2(200));


2、插入测试数据;

insert into test_task values (101,'Task_101');

insert into test_task values (102,'Task_102');

insert into test_task values (103,'Task_103');

insert into test_person values (1001,'Person_1001');

insert into test_person values (1002,'Person_1002');

insert into test_person values (1003,'Person_1003');

insert into test_task_person values (101,1001);

insert into test_task_person values (101,1002);

insert into test_task_person values (102,1001);

insert into test_task_person values (102,1003);

insert into test_task_person values (103,1001);

insert into test_task_person values (103,1003);

commit;


3、查询1,查询每个任务对应的担当者;select t.*, b.personName from test_task_person t, test_person b where t.personID = b.personID;

4、查询2,查询每个人承担的任务;select t.*, b.taskName from test_task_person t, test_task b where t.taskID = b.taskID;

flyingFish211
推荐于2017-09-27 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.5万
采纳率:50%
帮助的人:1.1亿
展开全部
防止出现有任务没有对应的人担当,因此用left join防止漏掉任务

查询1:每个任务对应的担当者
SELECT t.taskID, t.taskName, tp.personID, p.personName
FROM task t
LEFT JOIN TaskPerson tp ON t.taskID = tp.taskID
LEFT JOIN Person p ON p.personID = tp.personID

查询2:每个人承担的任务
SELECT p.personID, p.personName, tp.taskID, t.taskName
FROM Person p
LEFT JOIN TaskPerson tp ON p.personID = tp.personID
LEFT JOIN Task t ON t.taskID = tp.taskID
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友a800768
2011-03-17 · TA获得超过1841个赞
知道大有可为答主
回答量:1928
采纳率:0%
帮助的人:1720万
展开全部
查询1:每个任务对应的担当者
select taskName, personName from Task a,Person b,TaskPerson c
where a.taskID=c.taskID and b.personID=c.personID
group by taskName, personName
查询2:每个人承担的任务
select personName,taskName from Task a,Person b,TaskPerson c
where a.taskID=c.taskID and b.personID=c.personID
group by taskName, personName

两个结果好象是一样的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
大卫王DCW
2011-03-17 · TA获得超过447个赞
知道小有建树答主
回答量:289
采纳率:100%
帮助的人:137万
展开全部
两个SQL差不多,第二个加上groupby就可以了。
SQL1: select a.taskName, c.personName from task a, TaskPerson b, Person c
where a. taskID = b.taskID and b.personID = c.personID

SQL2: select a.taskName, c.personName from task a, TaskPerson b, Person c
where a. taskID = b.taskID and b.personID = c.personID gourpby c.personName
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
SRE
2011-03-17 · TA获得超过1024个赞
知道小有建树答主
回答量:250
采纳率:33%
帮助的人:108万
展开全部
第一个:
select taskID,taskName,personName from
TaskPerson,Person,Task
where TaskPerson.personID=Person.personID and
Task.taskID=TaskPerson.taskID
第二个:
select personName,taskID,taskName from
TaskPerson,Person,task
where TaskPerson.personID=Person.personID and
Task.taskID=TaskPerson.taskID
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式