首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQLServer2005在同一列中怎么显示来自多表的信息

2012-12-17 
SQLServer2005在同一列中如何显示来自多表的信息表ADATEDBDHXH-----------------------------------------

SQLServer2005在同一列中如何显示来自多表的信息
表A
DATE           DB        DH            XH
-------------------------------------------------
2012-10-5      591       121000020     0012
2012-10-12     541       121000151     0002
2012-11-05     D31       121100025     0030 

表B
DB       DH             XH         NOTE
-------------------------------------------------
591     121000020      0012       俄罗斯7362 

表C
DB       DH          XH         NOTE
-------------------------------------------------
541    121000151     0002      奥大利亚007157 

表D
DB       DH           XH        NOTE
-------------------------------------------------
D31     121100025    0030       佛山专卖 

现在要查询A、B、C、D四个表的信息,结果如以下显示:
DATE           DB      DH           XH       NOTE
----------------------
2012-10-5      591    121000020    0012     俄罗斯7362
2012-10-12     541    121000151    0002     奥大利亚007157
2012-11-05     D31    121100025    0030     佛山专卖    

SQL语句该怎么写呢?用CASE WHEN能做到吗?还望高手说得详细些,谢谢!
[最优解释]
1:日期格式出现很多0,是因为你定义的字段类型是datetime,而添加数据时只给了date,如果不想显示时间,最好定义为Date类型
2:出现这么多重复的数据,你在BCD表中添加了重复的数据,最后表有主键约束,或唯一性约束
3:过滤重复的数据,可以用distinct
如下,我试过了,是可以的:


select distinct E.DATE,E.DB,E.DH,E.XH,(
case 
when E.BNote is not null then E.BNote
when E.Cnote is not null then E.Cnote
when E.Dnote is not null then E.Dnote
else null
end ) as Note
from 
(select A.DATE,A.DB,A.DH,A.XH,B.NOTE BNote,C.NOTE Cnote,D.NOTE Dnote from tableA A
left join tableB B on A.DB =B.DB
left join tableC C on A.DB =C.DB
left join tableB D on A.DB =D.DB) as E

[其他解释]

--表A
if OBJECT_ID('tableA') is not null
drop table tableA


create table tableA
(
[DATE] date,
DB nvarchar(10),
DH nvarchar(10),
XH nvarchar(10)
)
go
insert into tableA
select '2012-10-5','591','121000020','0012' union all
select '2012-10-12','541','121000151','0002' union all
select '2012-11-05','D31','121100025','0030' 


--表B
if OBJECT_ID('tableB') is not null
drop table tableB
create table tableB
(
DB nvarchar(10),
DH nvarchar(10),
XH nvarchar(10),
NOTE nvarchar(20)
)
go
insert into tableB
select '591','121000020','0012','俄罗斯7362'


--表C
if OBJECT_ID('tableC') is not null
drop table tableC
create table tableC
(
DB nvarchar(10),
DH nvarchar(10),
XH nvarchar(10),
NOTE nvarchar(20)
)
go
insert into tableB
select '541','121000151','0002','奥大利亚007157'


--表D
if OBJECT_ID('tableD') is not null
drop table tableD
create table tableD
(
DB nvarchar(10),
DH nvarchar(10),
XH nvarchar(10),
NOTE nvarchar(20)
)
go
insert into tableB
select 'D31','121100025','0030','佛山专卖'

--sql
select E.DATE,E.DB,E.DH,E.XH,E.BNote from 
(select A.DATE,A.DB,A.DH,A.XH,B.NOTE BNote,C.NOTE Cnote,D.NOTE Dnote from tableA A
left join tableB B on A.DB =B.DB
left join tableC C on A.DB =C.DB
left join tableB D on A.DB =D.DB) as E

--结果
--DATEDBDHXHBNote
--2012-10-055911210000200012俄罗斯7362
--2012-10-125411210001510002奥大利亚007157
--2012-11-05D311211000250030佛山专卖


[其他解释]
修改下sql:

--sql
select E.DATE,E.DB,E.DH,E.XH,(
case 
when E.BNote is not null then E.BNote
when E.Cnote is not null then E.Cnote
when E.Dnote is not null then E.Dnote
else null
end ) as Note
from 
(select A.DATE,A.DB,A.DH,A.XH,B.NOTE BNote,C.NOTE Cnote,D.NOTE Dnote from tableA A
left join tableB B on A.DB =B.DB
left join tableC C on A.DB =C.DB
left join tableB D on A.DB =D.DB) as E

[其他解释]
引用:
修改下sql:
SQL code??12345678910111213--sqlselect E.DATE,E.DB,E.DH,E.XH,(case when E.BNote is not null then E.BNotewhen E.Cnote is not null then E.Cnotewhen E.Dnote is not null then E.Dnote……

现在查出来的结果比A表多出很多,用DISTINCT和GROUP BY也不行
[其他解释]
引用:
引用:修改下sql:
SQL code??12345678910111213--sqlselect E.DATE,E.DB,E.DH,E.XH,(case when E.BNote is not null then E.BNotewhen E.Cnote is not null then E.Cnotewhen E.Dnote i……

不是吧,能把结果贴出来么
这里是我查出来的结果:
 


--2012-10-055911210000200012俄罗斯7362
--2012-10-125411210001510002奥大利亚007157
--2012-11-05D311211000250030佛山专卖


[其他解释]
引用:
不是吧,能把结果贴出来么
 这里是我查出来的结果:

表B、C、D多插入些数据就可以看到效果了,顺便问一下,为什么我的日期格式会有这么0?
--2012-10-05 00:00:00.0005911210000200012俄罗斯7362
--2012-10-12 00:00:00.0005411210001510002奥大利亚007157
--2012-11-05 00:00:00.000D311211000250030佛山专卖
--2012-11-05 00:00:00.000D311211000250030佛山专卖
--2012-11-05 00:00:00.000D311211000250030佛山专卖
--2012-11-05 00:00:00.000D311211000250030佛山专卖

热点排行