sql多对多关系的两表如何联合查询出所有的结果?

两张表project表(projectId和projectName两个字段)和contract表(contractId和contractName)之间是多对多,中间还有一... 两张表project表(projectId和projectName两个字段)和contract表(contractId和contractName)之间是多对多,中间还有一个联合表(contract_project)记录每个projectId和contractId之间的关系,现在根据projectName或者projectId查询出所有的projectId,projectName,contractId,contractName信息,sql语句该怎么写?
用的数据库是oracle,如果把分页再加上去该怎么写?
展开
 我来答
小舅舅有点帅
推荐于2019-11-13 · TA获得超过1万个赞
知道答主
回答量:0
采纳率:0%
帮助的人:0
展开全部

1、语句如下:

Select project.*, [contract].* from project

Left join contract_project on project.projectId = contract_project.projectId

Left join [contract] on contract_project.contractId = [contract].contractId

注:contract在Sql server中是关键字,因此使用了中括号

2、使用Left join

Left join是以左表为准的。换句话说,左表(project)的记录将会全部表示出来,而右表(contract_project)只会显示符合搜索条件的记录

(例子中为: project.projectId = contract_project.projectId)。对于contract表来说,contract_project表是它的左表。

此例以两个left join 将三个表按条件联接在一起。

扩展资料

连接通常可以在select语句的from子句或where子句中建立,其语法格式为:

select colunm_name1,colunm_name2

from table_name1

left join table_name2

on table_name1.colunmname=table_name2.colunmname

其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接称为自连接, join_type 为连接类型,可以是left join 或者right join 或者inner join 。

on (join_condition)用来指连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。

参考资料:百度百科 left join



乐海白35
推荐于2019-08-13 · TA获得超过284个赞
知道答主
回答量:0
采纳率:0%
帮助的人:0
展开全部

1、语句如下:

Select project.*, [contract].* from project

Left join contract_project on project.projectId = contract_project.projectId

Left join [contract] on contract_project.contractId = [contract].contractId

注:contract在Sql server中是关键字,因此使用了中括号。

2、使用Left join

Left join是以左表为准的。换句话说,左表(project)的记录将会全部表示出来,而右表(contract_project)只会显示符合搜索条件的记录(例子中为: project.projectId = contract_project.projectId)。对于contract表来说,contract_project表是它的左表。

此例以两个left join 将三个表按条件联接在一起。

3、三表联查

实际开发过程中,经常遇到如题中的三表联查的情况。
用户角色 user + userInRole + role
用户部门 user + userInDept +Dept

你只需设置好各表的主键/外键,然后在查询编缉器中加入三个表,它的查询代码会自动生成。

扩展资料:

用普通查询处理三表联查

select * from project,contract_project,[contract]

where project.projectId = contract_project.projectId and contract_project.contractid = contract.contractId

它的基本形式: select * from 表A,表B,表C where 表A.a = 表B.a and 表B.d = 表C.d

注:该结果和两个LEFT JOIN的查询结果稍有不同。当表A在表B中没有相关联的数据时,该条记录将不会被查出,如题中“工程3”这条记录将不能被查出。同样情况也存在表B和表C之间。

参考资料:

百度百科.Left join

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ahdung
推荐于2017-11-25 · TA获得超过609个赞
知道小有建树答主
回答量:323
采纳率:100%
帮助的人:262万
展开全部
通过contract_project做中间表就行:
select *
from contract_project a
left join project b on a.projectId = b.projectId
left join contract c on a.contractId = c.contractId
前提是contract_project要大而全,包含所有的pid和cid,不然不行
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gax19860211
2012-09-14 · TA获得超过743个赞
知道答主
回答量:377
采纳率:0%
帮助的人:167万
展开全部
看的头晕啊,呵呵,难的想
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式