SQL 多对多查询

SQL 多对多查询,第1张

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条件查有啥区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10188330.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存