SQL语句求教!

momofisher 2010-08-30 10:46:14
我的系统文件数据库储存方式是这样的,
文件的列名保存在单张表(FileName)中(每一个列名为一行记录),文件的列值保存在表(FileValue)中.
两个表中通过FileID 文件种类、docID为文件列ID ,FID为文件ID

表 FileName
docID Name FileId
1 名称 te
2 大小 te
3 时间 te

表 FileValue

docId Name FileId FID
1 文件1 te d1

2 1kb te d1

3 2009 te d1

1 文件2 te d2

2 2kb te d2

3 2008 te d2

来关联出每个文件。
我现在要做一个查询,显示每个文件显示成一行。按照格式,

文件ID 名称 大小 时间

d1 文件1 1kb 2009

d2 文件2 2kb 2008


谢谢大家
...全文
102 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
momofisher 2010-08-30
  • 打赏
  • 举报
回复
那我要用java调用是不是要弄个存储过程啊?
百年树人 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 momofisher 的回复:]
when 后面的值不要写死啊自动从表中读取
[/Quote]

不能写死,只能用动态SQL,参考1楼
momofisher 2010-08-30
  • 打赏
  • 举报
回复
when 后面的值不要写死啊自动从表中读取
jaydom 2010-08-30
  • 打赏
  • 举报
回复

select FID, 名称=max(case FileName when '名称' then name else null end),
大小=max(case FileName when '大小' then name else null end),
时间=max(case FileName when '时间' then name else null end)
from
(
select b.Name as FileName,a.Name,a.FID
from FileValue a join FileName b on a.docId=b.docID
) a
group by FID


FID 名称 大小 时间
d1 文件1 1kb 2009
d2 文件2 2kb 2008
momofisher 2010-08-30
  • 打赏
  • 举报
回复
No,里面有动态获得的列名需要匹配
starseeker7 2010-08-30
  • 打赏
  • 举报
回复
額- -樹哥寫得好- -
LS的
print @sql
不是就是語句了嗎?
momofisher 2010-08-30
  • 打赏
  • 举报
回复
能整理成一条SQL语句吗?
百年树人 2010-08-30
  • 打赏
  • 举报
回复
---测试数据---
if object_id('[FileName]') is not null drop table [FileName]
go
create table [FileName]([docID] int,[Name] varchar(4),[FileId] varchar(2))
insert [FileName]
select 1,'名称','te' union all
select 2,'大小','te' union all
select 3,'时间','te'
go
if object_id('[FileValue]') is not null drop table [FileValue]
go
create table [FileValue]([docId] int,[Name] varchar(5),[FileId] varchar(2),[FID] varchar(2))
insert [FileValue]
select 1,'文件1','te','d1' union all
select 2,'1kb','te','d1' union all
select 3,'2009','te','d1' union all
select 1,'文件2','te','d2' union all
select 2,'2kb','te','d2' union all
select 3,'2008','te','d2'

---查询---
declare @sql varchar(8000)
select
@sql=isnull(@sql+',','')
+'max(case when a.name='''+name+''' then b.name else '''' end) as '+name
from
(select distinct a.name from [FileName] a,[FileValue] b where a.docID=b.docID) t

set @sql='select b.FID as 文件ID,'
+@sql
+' from [FileName] a,[FileValue] b where a.docID=b.docID group by b.FID'
--print @sql
exec (@sql)

---结果---
文件ID 大小 名称 时间
---- ----- ----- -----
d1 1kb 文件1 2009
d2 2kb 文件2 2008

(2 行受影响)
cnxywy 2010-08-30
  • 打赏
  • 举报
回复
(百年树人) 绝对牛人,他写的那个高深。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧