注册 登录
编程论坛 ASP技术论坛

突然碰到的的问题

javaxingxing 发布于 2010-03-01 19:06, 907 次点击
今天在百度上瞎逛  看到一个以前提问者的问题
我突然也想到个问题

举个例子吧
person表
id name  compid  addrid  codeid
comp表
id compname
addr表
id addrname
code表
id codename


我的意思是通过怎么一个sql语句查询显示如下

202  达赖喇嘛傻子   达赖喇嘛傻子制造公司   中国西藏   110110

搞不清怎么才能实现这个功能
left join  on 好像只能两个表
union吧   好像也行不通,恳请大家帮帮忙……
13 回复
#2
cnfarer2010-03-02 08:17
join完全可以的,谁说只能两个表,10表也没问题的(只要你不怕繁)!
#3
javaxingxing2010-03-02 09:54
我写一个sql语句,你看一下对不对

sql="select a.id,a.name,,c.addrname,d.codename from person as a inner join comp as b on

inner join addr as c on a.addrid=c.id inner join code as d on a.codeid=d.id"

我在网上搜了一下,基本上都是用两个表来举例子
#4
javaxingxing2010-03-02 17:34
怎么不说了,
我写的对不对啊,改怎么写呢……
#5
hmhz2010-03-02 17:49
楼上的写法是关联,需要每个表之间都要多几个字段放前一个表的ID才能使用关联语句来关联起来一次性把数据读出来

所以你的表结构不正确无法使用关联起到效果
#6
cnfarer2010-03-02 18:31
回复 3楼 javaxingxing
你写的没有什么大问题!可以自己试一试的啊!当然你写的可能得不到你想要的结果,因为全部用inner join 有的结果会出不来!

[ 本帖最后由 cnfarer 于 2010-3-2 19:29 编辑 ]
#7
cnfarer2010-03-02 19:36
这是我给你测试,写了2个查询语句,其结果的在有些情况下是一样的,有些情况下是不同的

程序代码:
create table person(id int,name char(10),compid int,addrid int,codeid int)
create table comp (id int, compname char(20))
create table addr (id int, addrname char(20))
create table code (id int, codename char(20))
go
insert into person values(1,'a',1,1,1)
insert into person values(2,'b',1,1,1)
insert into person values(3,'c',1,1,2)
insert into person values(4,'d',2,2,2)
insert into comp values(1,'acomp')
insert into comp values(2,'bcomp')
insert into addr values(1,'addra')
insert into addr values(2,'bddra')
insert into code values(1,'acode')
--insert into code values(2,'bcode')  --如果执行这一行,两个查询结果就一样,否则就不同
go
select a.id,a.name,,c.addrname,d.codename from ((person as a inner join comp as b on )
inner join addr as c on a.addrid=c.id) inner join code as d on a.codeid=d.id
select a.id,a.name,,c.addrname,d.codename from ((person as a left outer join comp as b on )
left outer join addr as c on a.addrid=c.id) left outer join code as d on a.codeid=d.id
#8
javaxingxing2010-03-03 09:31
谢谢cnfarer花时间给我测试
不过你说的那2个sql语句确实结果不一样
第一句是找匹配的,有没有code表里面有没有bcode没影响,有就显示,没有就不显示
第二句是左外连接,有bcode那么和第一个sql语句查询结果一样,没有bcode他也显示,只不过对应的bcode是null

不知道我说的对不对?

感觉5楼说的有道理
就是我的这个表就有点问题
打个比方:
person表应该是用户注册时填写的,那么公司名称,地址,邮编都是自己填写的,而不是从数据库中某一个表中读出来,让用户去选择;
所以表本身有问题……

其实我发这个贴的目的主要是体会一下
关联的多个表之间怎么查询  就是类似inner join     /  left join

[ 本帖最后由 javaxingxing 于 2010-3-3 09:34 编辑 ]
#9
cnfarer2010-03-03 10:52
回复 8楼 javaxingxing
不同用途,使用不同的设计。其实你的表,从关系规范化角度来讲,更好一些!

用户注册谁会真实的写公司、地址啊,如果用于业务往来,一个公司就可能有多个业务员。一个公司也可能使用不同的地址。所以你的表应该更灵活!
addr code这两个表,如果code是邮编的话应该合并


我的测试就说明了5楼的说法是对还是。。。

[ 本帖最后由 cnfarer 于 2010-3-3 11:00 编辑 ]
#10
javaxingxing2010-03-03 21:26

明白了   知道多个表关联的时候
 sql语句 里面注意   from后面的那些括号
#11
hmhz2010-03-04 10:37
表之间的关联,当然需要有关联的条件,通常使用ID之间关联,当然也可以使用其它不是ID的内容来关联

只要两个表之间有个依据联系起来就OK了
#12
cnfarer2010-03-04 10:39
回复 10楼 javaxingxing
其实()不重要,没有也行,只是为了看着清楚
#13
qpjiangjie2010-03-04 14:11
sql 语言应该可以查找出来  关联么
1