Sql 语句多表连接

现在有这样的三张表:
A:id1 (id1 是主键)
B: id1,id2 (id1是外键,id1+id2是联合主键)
C: id1,id2,id3 (id1+id2+id3是联合主键)

需求:
从C表中查询数据,同时关联A和B表
sql实现:
select *
from a,b,c
where a.id1=b.id1
and b.id1=c.id1
and b.id2=c.id2
从真实数据反映的结果:
219304800(没有写任何查询条件)
11944(没有添加 b.id2=c.id2)
990(所有条件都有的条数)
39458(没有添加b和c表的连接条件 b.id1=c.id1)
只加 a.id1=b.id1 and b.id1=c.id1 条件的情况就是这三张表中id1都是唯一的

问题还有很多:比如说,id2在表b中也是不可以重复的,又是该怎样处理呢,答案还是上面的sql语句。

提出出问题是由于对表的结构不了解所引发了冗余数据的现象,只是想提醒一下,在关联多张表的时候需要算一下笛卡尔积,如果笛卡尔积是唯一,那么你的答案就是对的。

insert into a values(1)
insert into a values(2)

insert into b values(1,1)
insert into b values(1,2)
insert into b values(2,1)
insert into b values(2,2)

insert into c values(1,1,1)
insert into c values(1,1,2)
insert into c values(1,2,1)
insert into c values(1,2,2)
insert into c values(2,1,1)
insert into c values(2,1,2)
insert into c values(2,2,1)
insert into c values(2,2,2)

使用笛卡尔积来分析一下下面的三张表:
笛卡尔积:简单来说就是一个矩阵,更专业的可以查看相关的资料
如果什么都不加会出现 2*4*8=64条数据
如果添加了查询条件a.id1=b.id1 and b.id1=c.id1结果会出现多少呢?
16 为什么会变成16呢? 差值为48,48是怎么去掉的

原因是除掉了b.id2=c.id2所冗余的信息 就上面的数据来说,减少了1(a.id1)对应了2(c.id1)的情况
如果添加了a.id1=b.id1 and b.id1=c.id1 and b.id2=c.id2结果会是多少呢?
8 完全没有重复

归根结底还是理论知识,扎实的理论知识是你今后发展的基石,所有我们一定要深入了解理论,不可停留在事物的表面。

总体上来说还是有点不太明白,希望有人能指点一下。自己也在查找资料,如果解决了跟大家分享。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值