我有2个表event + event_artist
eventId | eventName
-------------------
1 , gig1
2, gig2
eventId, artistName
-------------------
1, Led Zip
1, The Beatles
即Led Zep和甲壳虫乐队都在玩@ Gig1
我需要创建SQl以绑定到gridview(你需要知道gridviews来解答这个问题)
我想要的结果看起来像这样 eventId = 1,EventName = Gig1。 ArtistLineup = Led Zep,披头士乐队
所以我需要创建一个列出所有艺术家的别名ArtistLineup。通过内心选择我认为。
关于这会是什么样子的任何想法。
答案 0 :(得分:3)
在SQL Server Magazine中看到这一点 - 不是很好,总列表将有一个长度上限,但是:
drop table event
go
drop table event_artist
go
create table event (eventid int, eventname varchar(255))
go
create table event_artist (eventid int, artistname varchar(255))
go
insert into event values (1, 'gig1')
go
insert into event values (2, 'gig2')
go
insert into event_artist values (1, 'Led Zip')
go
insert into event_artist values (1, 'The Beatles')
go
drop function Event_Display
go
create function Event_Display (@EventID int) returns varchar(2000) as
begin
declare @artistList varchar(2000)
set @artistList=''
select @artistList=@artistList + ', ' + isnull(artistname,'')
from event_artist
where eventid=@EventID
return substring(@artistList,3,2000) --eliminate initial comma
end
go
select event.eventid, event.eventname, dbo.Event_Display(event.eventid) from event
1 gig1 Led Zip, The Beatles 2 gig2
答案 1 :(得分:0)
SQL Server没有内置任何内容来连接一个语句中的值。你可以构建字符串,但必须一次完成一个。
但是,您可以通过构建自己的custom aggregate function来解决这个问题(需要在SQL Server 2000中使用ActiveX对象进行混乱的游戏)
答案 2 :(得分:0)
你可能想尝试这样的事情: Why does this SQL script work as it does?
答案 3 :(得分:0)
ScottK的答案基本上就是你想要的答案。这是我的其余部分:
查询:
select e.*, dbo.ArtistList(e.EventId) as ArtistList
from [event] e
功能:
CREATE FUNCTION ArtistList<br>
(
-- Add the parameters for the function here<br>
@EventId int<br>
)
RETURNS varchar(MAX)<br>
AS
BEGIN
-- Declare the return variable here
DECLARE @ArtistList varchar(MAX)
-- Add the T-SQL statements to compute the return value here
SELECT @ArtistList = COALESCE(@ArtistList + ', ', '') + Artist
FROM EventArtist
WHERE EventId = @EventId
-- Return the result of the function
RETURN @ArtistList
END
GO
我的回答和你可能注意到的ScottK之间的唯一区别是我对varchar(MAX)
的使用。这应该可以解决有关被截断的艺术家名单的任何问题。
我删除了之前的(不完整的)答案。
答案 4 :(得分:0)
您可以use the clever FOR XML trick发布Kevin Fairchild(我已修改它以考虑包含空格的乐队名称):
/*
create table [event] (eventid int, eventname varchar(255))
create table event_artist (eventid int, artistname varchar(255))
insert into [event] values (1, 'gig1')
insert into [event] values (2, 'gig2')
insert into event_artist values (1, 'Led Zip')
insert into event_artist values (1, 'The Beatles')
*/
SELECT e.eventid
,e.eventname
,REPLACE(REPLACE(RTRIM((
SELECT artistname + '| '
FROM [event_artist]
WHERE eventid = e.eventid
FOR
XML PATH('')
)), '| ', ', '), '|', '') AS artists
FROM [event] AS e
请注意,这需要FOR XML中的列未命名(命名列获取XML包装器)。