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

關於select查詢的寫法,该怎么解决

2012-01-11 
關於select查詢的寫法我有一張表:TEST(Menu_Namevarchar(3),Action_Namevarchar(4))里面的資料顯示為Menu_

關於select查詢的寫法
我有一張表:TEST(Menu_Name   varchar(3),   Action_Name   varchar(4)   )
里面的資料顯示為
Menu_Name               Action_Name
  A01                               新增
  A01                               修改
  A01                               刪除
  A01                               審核
  B01                               新增
  B01                               修改
  C01                               刪除
  C01                               審核
現在我想用SELECT查詢顯示結果為:
  Menu_Name             Action_Name
      A01                           新增;修改;刪除;審核
      B01                           新增;修改
      C01                           刪除;審核

請大家指教一二,感激不盡!

[解决办法]

create table T(Menu_Name varchar(3), Action_Name varchar(4) )
insert T select 'A01 ', '新增 '
union all select 'A01 ', '修改 '
union all select 'A01 ', '刪除 '
union all select 'A01 ', '審核 '
union all select 'B01 ', '新增 '
union all select 'B01 ', '修改 '
union all select 'C01 ', '刪除 '
union all select 'C01 ', '審核 '

create function fun(@Menu_Name char(3))
returns varchar(100)
as
begin
declare @re varchar(1000)
set @re= ' '
select @re=@re+Action_Name+ '; ' from T where Menu_Name=@Menu_Name
select @re=left(@re, len(@re)-1)

return @re
end

select distinct Menu_Name, dbo.fun(Menu_Name) as Action_Name from T

--result
Menu_Name Action_Name
--------- ----------------------------------------------------------------
A01 新增;修改;刪除;審核
B01 新增;修改
C01 刪除;審核

(3 row(s) affected)

[解决办法]
create table test(Menu_Name varchar(3), Action_Name varchar(4))
insert into test(Menu_Name , Action_Name ) values ( 'A01 ', '新增 ')
insert into test(Menu_Name , Action_Name ) values ( 'A01 ', '修改 ' )
insert into test(Menu_Name , Action_Name ) values ( 'A01 ', '刪除 ')
insert into test(Menu_Name , Action_Name ) values ( 'A01 ', '審核 ')
insert into test(Menu_Name , Action_Name )values ( 'B01 ', '新增 ')


insert into test(Menu_Name , Action_Name )values ( 'B01 ', '修改 ')
insert into test(Menu_Name , Action_Name )values ( 'C01 ', '刪除 ')
insert into test(Menu_Name , Action_Name ) values ( 'C01 ', '審核 ')
go
create function f_hb(@a varchar(10))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ' '
select @str = @str + '; ' + Action_Name from test where Menu_Name = @a
set @str = right(@str , len(@str) - 1)
return(@str)
End
go


select distinct Menu_Name,dbo.f_hb(Menu_Name) as Action_Name from test

drop table test
drop function f_hb
结果:
Menu_Name Action_Name
--------- -------------------
A01 新增;修改;刪除;審核
B01 新增;修改
C01 刪除;審核

(所影响的行数为 3 行)

[解决办法]
--臨時表法

select Menu_Name, Action_Name=cast(Action_Name as varchar(100)) into #T from T order by Menu_Name

declare @Menu_Name varchar(3), @Action_Name varchar(100)
update #T set
@Action_Name=case when Menu_Name=@Menu_Name then @Action_Name+ '; '+Action_Name else Action_Name end,
@Menu_Name=Menu_Name,
Action_Name=@Action_Name

select Menu_Name, max(Action_Name) as Action_Name from #T group by Menu_Name

--result
Menu_Name Action_Name
--------- ----------------------------------------------------------------
A01 新增;修改;刪除;審核
B01 新增;修改
C01 刪除;審核

(3 row(s) affected)
[解决办法]
create table T(Menu_Name varchar(3), Action_Name varchar(4) )
insert T select 'A01 ', '新增 '
union all select 'A01 ', '修改 '
union all select 'A01 ', '刪除 '
union all select 'A01 ', '審核 '
union all select 'B01 ', '新增 '
union all select 'B01 ', '修改 '
union all select 'C01 ', '刪除 '
union all select 'C01 ', '審核 '

alter table t add 显示列 varchar(20)--新增显示列
go
declare @ta table(id int identity(1,1),Menu_Name varchar(3),Action_Name varchar(4))
insert @ta
select Menu_Name,Action_Name from T
while exists(select 1 from @ta)
begin
update t
set 显示列=isnull(显示列+ ', ', ' ')+ta.Action_Name
from @ta ta,t
where t.Menu_Name=ta.Menu_Name and
not exists(select 1 from @ta where Menu_Name=ta.Menu_Name and id <ta.id)

delete ta
from @ta ta
where not exists(select 1 from @ta where Menu_Name=ta.Menu_Name and id <ta.id)
end
go
select distinct Menu_Name,显示列 from t--查询
go
alter table t drop column 显示列--删除
Menu_Name 显示列
--------- --------------------
A01 新增,修改,刪除,審核
B01 新增,修改
C01 刪除,審核

(所影响的行数为 3 行)

热点排行
Bad Request.