首页 > 技术文章 > 数据库连表查询

sprite 2013-12-04 23:12 原文

当需要联表的时候,数据库会先求出要连的表的笛卡尔乘积,然后根据条件进行查询。

以下是会员类型表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>

 

就这样。。。推荐中南大学徐立臻老师的数据库原理视频教程,讲的真心不错。

推荐阅读