当需要联表的时候,数据库会先求出要连的表的笛卡尔乘积,然后根据条件进行查询。
以下是会员类型表leveltype和会员表 mem_localmemberinfobase的一些数据
1> use local
2> select levelid,levelname from leveltype
3> go
levelid levelname
----------- --------------------
1 普通会员
2 员工卡
3 黄金会员
(3 行受到影响)
1>
1> select top 10 levelid,uniqueid from mem_localmemberbaseinfo
2> go
levelid uniqueid
----------- --------------------
1 4282044
1 3357088
1 3348926
1 4282043
1 4082692
1 3987924
1 3473410
1 5136427
1 4082683
1 4818906
(10 行受到影响)
1>
当我们联表查询时,我想打印出livelid为 1 的会员的 uniqueid 和 levelname我试着用以下语句
1> select top 15 m.uniqueid,l.levelname
2> from mem_localmemberbaseinfo as m,leveltype as l
3> where m.levelid=1
4> go
uniqueid levelname
-------------------- --------------------
4282044 普通会员
4282044 员工卡
4282044 黄金会员
3357088 普通会员
3357088 员工卡
3357088 黄金会员
3348926 普通会员
3348926 员工卡
3348926 黄金会员
4282043 普通会员
4282043 员工卡
4282043 黄金会员
4082692 普通会员
4082692 员工卡
4082692 黄金会员
(15 行受到影响)
1>
what'up ,levelid为1的是普通会员啊,怎么会有一大堆的员工卡和黄金会员,这就是连表产生笛卡尔积的结果,他是列出所有两个表联合可能的行,然后在这些所有的行里找m.levelid为1的,使用以下语句就可以得到我们想要的结果。
1> select top 10 m.uniqueid,l.levelname
2> from mem_localmemberbaseinfo as m,leveltype as l
3> where m.levelid=1 and m.levelid=l.levelid
4> go
uniqueid levelname
-------------------- --------------------
4282044 普通会员
3357088 普通会员
3348926 普通会员
4282043 普通会员
4082692 普通会员
3987924 普通会员
3473410 普通会员
5136427 普通会员
4082683 普通会员
4818906 普通会员
(10 行受到影响)
1>
就这样。。。推荐中南大学徐立臻老师的数据库原理视频教程,讲的真心不错。