2008-11-17 8 views
1

J'ai 2 tables événement + event_artistintérieur sélectionner sur un à plusieurs

événement
de eventId | eventName
1, gig1
2, gig2

event_artist
eventId, ARTISTNAME
1, Led Zip
1, Les Beatles

-à-dire Led Zep et les Beatles sont tous deux en cours de lecture @ Gig1

Je dois créer le SQl pour lier à un gridview (vous devez nécessairement connaître les vues de grille pour répondre à cela)

Les résultats que je veux ressembler à ceci eventId = 1, EventName = Gig1. ArtistLineup = Led Zep, les beatles

J'ai donc besoin de créer un alias ArtistLineup qui répertorierait tous les artistes. Via un select intérieur je pense.

Toutes les pensées sur ce que cela ressemblerait.

Répondre

3

vu dans SQL Server Magazine- pas grande, et la liste complète auront une limite de longueur supérieure, mais:

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 @[email protected] + ', ' + isnull(artistname,'') 
    from event_artist 
    where [email protected] 

    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  
0

SQL Server n'a rien intégré pour concaténer des valeurs dans une instruction comme celle-là. Vous pouvez construire les cordes, mais cela doit être fait un à la fois.

Cependant, vous pouvez contourner ce problème en construisant votre propre custom aggregate function (nécessite des jeux en désordre avec des objets ActiveX dans SQL Server 2000)

0

La réponse de ScottK est fondamentalement celle que vous voulez. Voici le reste de la mine:

La requête:

select e.*, dbo.ArtistList(e.EventId) as ArtistList 
from [event] e 

La fonction:

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 

La seule différence entre ma réponse et ScottK vous pourriez prendre note de mon utilisation de varchar(MAX). Cela devrait régler à peu près toutes les préoccupations au sujet de la liste des artistes tronqués. J'ai supprimé ma réponse précédente (incomplète).

+0

Cela ne fonctionne que pour un élément à la fois.Il devrait les exécuter dans un curseur s'il veut plus d'un résultat, ce qui est moins que souhaitable. –

+0

Merci pour le commentaire. Ma réponse révisée résout le problème que vous avez soulevé. –

0

Vous pouvez use the clever FOR XML trick posté par Kevin Fairchild (je l'ai modifié pour tenir compte des noms de bande qui comprendra des espaces):

/* 
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 

Notez que cela nécessite des colonnes du FOR XML à colonnes sans nom (nom obtenir un wrapper XML).

Questions connexes