Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Select с объединением строк  [new]
Viola5
Member

Откуда:
Сообщений: 17
Здравствуйте.
Помогите пожалуйста:
Существует несколько таблиц. Одна из них список фильмов, другая - тип фильма (драма, комедия, боевик и т.п.). Разумеется, что фильм может быть нескольких жанров. Как в SQL SERVER написать SEECT, чтобы получить следующий результат:

Пираты Карибов комедия, приключения
Иствикские ведьмы комедия, мистика, драма

и т.д. (возможно или без использования функций?)
Заранее спасибо!
11 ноя 11, 18:03    [11584316]     Ответить | Цитировать Сообщить модератору
 Re: Select с объединением строк  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
join
11 ноя 11, 18:09    [11584392]     Ответить | Цитировать Сообщить модератору
 Re: Select с объединением строк  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Viola5
Разумеется, что фильм может быть нескольких жанров
Сложение символьных полей в запросе
11 ноя 11, 18:10    [11584401]     Ответить | Цитировать Сообщить модератору
 Re: Select с объединением строк  [new]
Viola5
Member

Откуда:
Сообщений: 17
Паганель,
я там была, но не совсем разобралась: новичок совсем...
Помогите...
11 ноя 11, 18:21    [11584505]     Ответить | Цитировать Сообщить модератору
 Re: Select с объединением строк  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
давайте скрипт создающий тестовые таблицы и заливающий в них тестовые данные
11 ноя 11, 18:29    [11584571]     Ответить | Цитировать Сообщить модератору
 Re: Select с объединением строк  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Viola5,

-- тестовые данные
declare @Films table(FilmID int primary key, Name varchar(100))
declare @Types table(TypeID int primary key, Name varchar(100))
declare @FilmTypes table(FilmID int, TypeID int)
insert into @Types select 1, 'Комедия'
insert into @Types select 2, 'Драмма'
insert into @Types select 3, '"Шлак"'
insert into @Films select 1, 'Достучаться до небес'
insert into @Films select 2, 'Самый лучший фильм'
insert into @FilmTypes select 1,1
insert into @FilmTypes select 1,2
insert into @FilmTypes select 2,1
insert into @FilmTypes select 2,3

-- в тысячный раз один и тот же запрос=)
select
	FilmID,
	Name,
	Types = stuff((
		select 
			', ' + t.Name 
		from 
			@FilmTypes ft
			join @Types t on ft.TypeID = t.TypeID
		where 
			ft.FilmID = f.FilmID
		for xml path(''), type
	).value('.','nvarchar(max)'),1,2,'')
from
	@Films f
11 ноя 11, 18:50    [11584723]     Ответить | Цитировать Сообщить модератору
 Re: Select с объединением строк  [new]
Viola5
Member

Откуда:
Сообщений: 17
Паганель, спасибо!
Вот:
Построение таблиц:
create table FilmType          
 (
  FilmType_Id int primary key,
  FilmType_Name char(50) not null
 )
 create table Film              -- V --
(
 Film_Id char (8) primary key,
 Film_Name char (250) not null,
 Film_ManufactureDate date not null,
 City_ID int references City(City_ID),
 Director_ID int references Director(Director_ID)
 )
Заполнение данными:
insert into Film values('F1','X-Men','20000713',7,10) 
 insert into Film values('F2','Van Helsing','20040507',8,1) 
 insert into Film values('F3','The Astronaut Wife','19990827',6,2)
 insert into Film values('F4','The Curious Case of Benjamin Button','20081225',6,8) 
 insert into Film values('F5','Space Cowboys','20000801',6,7)
 insert into Film values('A3','Pirates of Caribbean','20030709',8,15)

insert into FilmType values(1,'mistic')
 insert into FilmType values(2,'comedy')
 insert into FilmType values(3,'drama')
 insert into FilmType values(4,'fiction')
 insert into FilmType values(5,'documentary')
А вот запрос,который надо подправить:
 -- 1)Displays the list of films and their copies in the library,   --58
 --   including the type of each film, the names of its directors, 
 --   key participants, status of copies and their location in the library.
select distinct f.Film_Name, ft.FilmType_Name,LEFT(d.Director_LastName, 10)+' '+LEFT(d.Director_FirstName,10) as DirectorName,LEFT(a.Actor_LastName,10)+' '+LEFT(a.Actor_FirstName,10) as LeadActors , fc.FilmCopy_Quantity as Quantity,cs.State_Name as CopyState,l.Location_Name
from Film f, ToBeOfType tb, FilmCopy fc, FilmType ft,Director d,Actor a,CopyState cs, Location l, RoleOfActorsInFilms ra, Roles r
where f.Film_Id=fc.Film_ID
  and f.Film_Id=tb.Film_Id
  and tb.FilmType_Id=ft.FilmType_Id
  and f.Director_ID=d.Director_ID
  and a.Actor_ID=ra.Actor_ID
  and f.Film_Id=ra.Film_Id
  and fc.State_ID=cs.State_ID
  and fc.Location_ID=l.Location_ID
  and r.Roles_ID=ra.Roles_ID
  and r.Roles_Plane='lead'
12 ноя 11, 20:34    [11587461]     Ответить | Цитировать Сообщить модератору
 Re: Select с объединением строк  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
И где в Ваших тестовых данных указана принадлежность фильмов к жанрам?
12 ноя 11, 20:40    [11587473]     Ответить | Цитировать Сообщить модератору
 Re: Select с объединением строк  [new]
Viola5
Member

Откуда:
Сообщений: 17
Паганель,
аааа, да, это же многие к многим:
 create table ToBeOfType       
 (
  Film_Id char (8) references Film(Film_ID),
  FilmType_Id int references FilmType(FilmType_ID),
  primary key (Film_ID, FilmType_Id)  
 )
insert into ToBeOfType values('F1',4)
 insert into ToBeOfType values('F2',4)
 insert into ToBeOfType values('F2',10)
 insert into ToBeOfType values('F3',4)
 insert into ToBeOfType values('F4',4)
 insert into ToBeOfType values('F4',1)
 insert into ToBeOfType values('F4',3)
 insert into ToBeOfType values('F5',4)
12 ноя 11, 20:48    [11587487]     Ответить | Цитировать Сообщить модератору
 Re: Select с объединением строк  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Запрос, представленный SomewhereSomehow, Вас устраивает?
12 ноя 11, 20:58    [11587520]     Ответить | Цитировать Сообщить модератору
 Re: Select с объединением строк  [new]
Viola5
Member

Откуда:
Сообщений: 17
Паганель,
я не совсем его поняла (мы немного по-другому учили) - пытаюсь разобраться, понять и переделать на мои таблицы...
12 ноя 11, 21:11    [11587554]     Ответить | Цитировать Сообщить модератору
 Re: Select с объединением строк  [new]
Viola5
Member

Откуда:
Сообщений: 17
Паганель,
я о чень прошу прощения: посидела но не сообразила (опыта видать не хватает) - если уже созданы таблицы и внесены в них данные без @, как их объявить в Select?
15 ноя 11, 00:37    [11596661]     Ответить | Цитировать Сообщить модератору
 Re: Select с объединением строк  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Имена @Films, @Types и @FilmTypes заменить на имена реальных таблиц
С именами полей сделать то же самое
15 ноя 11, 00:42    [11596671]     Ответить | Цитировать Сообщить модератору
 Re: Select с объединением строк  [new]
Viola5
Member

Откуда:
Сообщений: 17
SomewhereSomehow,
все получилось!
Спасибо!!!
15 ноя 11, 13:19    [11598834]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить