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, bpersonName from test_task_person t, test_person b where tpersonID = bpersonID;
4、查询2,查询每个人承担的任务;select t, btaskName from test_task_person t, test_task b where ttaskID = btaskID;
1用户表
列:id, 姓名, 等
2分组表
列:id, 组名, 用户id
3好友表
列:id, 好友id, 分组id
示例:
1用户1 创建新分组"我的好友"
INSERT INTO 分组表 (组名, 用户id) VALUES('我的好友', 1);
2用户1 将 用户2 添加到"我的好友"
INSERT INTO 好友表 (好友id, 分组id) VALUES(2, (SELECT id FROM 分组表 WHERE 组名='我的好友' AND 用户id=1))
3查询 用户1 "我的好友" 分组下的全部好友
SELECT id, 姓名 FROM 用户表
WHERE id IN(
SELECT id FROM 好友表 JOIN 分组表 ON 好友表分组id=分组表id
WHERE 分组表组名='我的好友' AND 分组表用户id=1
)
where语句连的话对结果更为精确,下面举个例子:
select form table1,table2 where table1size = table2size and table2name='Tom';
select form table1 left join table2 on (table1size = table2size and table2name='Tom)';
第一句查询先生成一个中间表,是二表相连结果,然后再对条件进行筛选,所得只有一条结果。
第二句查询如果table2name没有匹配上Tom的话也会返回,只不过返回的字段为null
楼主这个级联更新我才疏学浅给分为2步骤, 先更新A表。 在更新B表,一条语句更新2张表的写法我目前写不来。下面是我的sql 你看是否与你的要求一致。
--更新A表update A set Atag=0 from A INNER JOIN ( --获取 多对多关系C表 并根据A表时间来获得需要更新的A表ID 和B表ID select cAid,cBid from C INNER JOIN A ON Aid = cAid INNER JOIN B ON Bid =cBid where ATime<getDate() --根据某时间条件。 AND ATag =0 --A的Tag 为0 时 ) result
ON resuleAid=AID
--更新B表update B set Btag=0 from B INNER JOIN ( --获取 多对多关系C表 并根据A表时间来获得需要更新的A表ID 和B表ID select cAid,cBid from C INNER JOIN A ON Aid = cAid INNER JOIN B ON Bid =cBid where ATime<getDate() --根据某时间条件。 AND ATag =0 --A的Tag 为0 时 ) result
ON resuleBid=BID
多对多的关系会生成一张中间表来建立关联,可以对中间表进行配置,以达到满意的效果!
@JoinTable描述了多对多关系的数据表关系。name属性指定中间表名称,joinColumns定义中间表与Teacher表的外键关系。
中间表tea_stu的tea_id列是Teacher表的主键列对应的外键列,inverseJoinColumns定义了中间表与另外一端(Student)的外键关系。
执行了11条SQL,先插入老师的信息,再插入学生的信息,再更新中间表的信息(学生与老师的关系)。
当没有去使用list集合时,此时并没有去执行查询list集合数据,说明是延迟加载!
小结:
1配置单向多对多的关系时,只需要使用注解@manyTomany
2多对多会生成中间表来维护双方的关系
3需要重新配置中间表的信息时,需要使用注解@JoinTable(name="中间表名",joinColumns = @JoinColumn(name = "当前表的外键名"),inverseJoinColumns=@JoinColumn(name = "关联表的外键名"))。
4添加数据时,都会发送大量的SQL,不仅要添加两张表的数据,还要添加中间表的关系,所以效率低。
以上就是关于SQL 多对多查询全部的内容,包括:SQL 多对多查询、数据库表设计 QQ好友间的多对多关系、多对多关系的表联合查询用left join和直接用where条件查有啥区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)