Внутренний выбор от одного ко многим - PullRequest
1 голос
/ 17 ноября 2008

У меня есть 2 таблицы событие + event_artist

событие

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

event_artist

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

т.е. Led Zep и The Beatles играют @ Gig1

Мне нужно создать SQl для привязки к сетке (вам обязательно нужно знать о сетках, чтобы ответить на это)

Результаты, которые я хочу получить, будут выглядеть следующим образом
eventId = 1, EventName = Gig1. ArtistLineup = Led Zep, The Beatles

Так что мне нужно создать псевдоним ArtistLineup, который бы перечислял всех художников. Я думаю, с помощью внутреннего выбора.

Любые мысли о том, как это будет выглядеть.

Ответы [ 5 ]

3 голосов
/ 17 ноября 2008

Видел это в журнале SQL Server - не очень, и общий список будет иметь верхний предел длины, но:

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     
0 голосов
/ 17 ноября 2008

Вы можете использовать хитрый трюк FOR XML от Кевин Фэйрчайлд (я изменил его, чтобы учесть имена групп, которые будут содержать пробелы):

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

0 голосов
/ 17 ноября 2008

Ответ Скотта в основном тот, который вы хотите. Вот мой остаток:

Запрос:

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

Единственное различие между моим ответом и ответом Скотта, на которое вы могли бы обратить внимание, заключается в моем использовании varchar(MAX) Это должно в значительной степени решить любые проблемы, связанные с сокращением списка художников.

Я удалил свой предыдущий (неполный) ответ.

0 голосов
/ 17 ноября 2008

вы можете попробовать что-то вроде этого: Почему этот сценарий SQL работает так же, как и он?

0 голосов
/ 17 ноября 2008

SQL Server не имеет ничего встроенного для объединения значений в одном выражении, подобном этому. Вы можете создавать строки, но это нужно делать по одной за раз.

Однако вы можете обойти это, создав собственную собственную функцию агрегирования (требуются грязные игры с объектами ActiveX в SQL Server 2000)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...