内部选择一对多

时间:2008-11-17 14:34:53

标签: .net sql sql-server tsql

我有2个表event + event_artist

事件

eventId | eventName  
-------------------
1 , gig1  
2, gig2    

event_artist

eventId, artistName 
------------------- 
1, Led Zip  
1, The Beatles  

即Led Zep和甲壳虫乐队都在玩@ Gig1

我需要创建SQl以绑定到gridview(你需要知道gridviews来解答这个问题)

我想要的结果看起来像这样 eventId = 1,EventName = Gig1。 ArtistLineup = Led Zep,披头士乐队

所以我需要创建一个列出所有艺术家的别名ArtistLineup。通过内心选择我认为。

关于这会是什么样子的任何想法。

5 个答案:

答案 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包装器)。