Я столкнулся с этим вопросом, все предлагаемые решения имеют тенденцию идти одинаково, но в моем случае это очень неудобно.TSQL: как объединить строку значений GROUPED
В большинстве случаев предлагается нечто подобное.
DECLARE @Actors TABLE ([Id] INT , [Name] VARCHAR(20) , [MovieId] INT);
DECLARE @Movie TABLE ([Id] INT, [Name] VARCHAR(20), [FranchiseId] INT);
INSERT INTO @Actors
(Id, Name, MovieId)
VALUES (1, 'Sean Connery', 1),
(2, 'Gert Fröbe', 1),
(3, 'Honor Blackman', 1),
(4, 'Daniel Craig', 2),
(5, 'Judi Dench', 2),
(2, 'Harrison Ford', 3)
INSERT INTO @Movie
(Id, Name, FranchiseId)
VALUES (1, 'Goldfinger', 1),
(2, 'Skyfall', 1),
(3, 'Return of the Jedi', 2)
SELECT m.Name ,
STUFF((SELECT ',' + a_c.Name
FROM @Actors a_c
WHERE a_c.MovieId = m.Id
FOR
XML PATH('')
), 1, 1, '')
FROM @Actors a
JOIN @Movie m ON a.MovieId = m.Id
GROUP BY m.Id ,
m.Name
Проблема заключается в том (как мне объяснить?), Один на самом деле не получить доступ к сгруппированным элементам (как Count(), Max(), Min(), ...), один ли перестраивать присоединение шаблон «внешнего запроса» и силу в операторе WHERE, что соответствующие значения те же, что и в операторе GROUP BY (во внешнем запросе).
Если вы не понимаете, что я хочу сказать, я продлила пример выше, один дополнительный стол, и вы увидите, что я также должен будет расширить «внутренний запрос»
DECLARE @Actors TABLE ([Id] INT , [Name] VARCHAR(20) , [MovieId] INT);
DECLARE @Movie TABLE ([Id] INT, [Name] VARCHAR(20), [FranchiseId] INT);
DECLARE @Franchise TABLE ([Id] INT , [Name] VARCHAR(20));
INSERT INTO @Actors
(Id, Name, MovieId)
VALUES (1, 'Sean Connery', 1),
(2, 'Gert Fröbe', 1),
(3, 'Honor Blackman', 1),
(4, 'Daniel Craig', 2),
(5, 'Judi Dench', 2),
(2, 'Harrison Ford', 3)
INSERT INTO @Movie
(Id, Name, FranchiseId)
VALUES (1, 'Goldfinger', 1),
(2, 'Skyfall', 1),
(3, 'Return of the Jedi', 2)
INSERT INTO @Franchise
(Id, Name)
VALUES (1, 'James Bond'),
(2, 'Star Wars')
SELECT f.Name ,
STUFF((SELECT ',' + a_c.Name
FROM @Actors a_c
JOIN @Movie m_c ON a_c.MovieId = m_c.Id
WHERE m_c.FranchiseId = f.Id
FOR
XML PATH('')
), 1, 1, '')
FROM @Actors a
JOIN @Movie m ON a.MovieId = m.Id
JOIN @Franchise f ON m.FranchiseId = m.Id
GROUP BY f.Id ,
f.Name
И теперь, идя несколько дальше, представьте огромный запрос, очень сложный, несколько значений группировки во многих таблицах. Эффективность - это проблема. Я не хочу перестраивать весь шаблон объединения во «внутреннем запросе».
Так есть ли другой способ? Способ, который не убивает производительность, и вам не нужно дублировать шаблон соединения?
Извините, но я не понимаю ваш вопрос. Что именно здесь не работает? (Например, когда вы говорите: _ «никто не делает этого и этого]» _, ссылаетесь ли вы на запросы, которые вы показываете, или вы ссылаетесь на то, что вы хотели бы * сделать (но не надейся) t знаете как)?) – stakx
Мой пример работает, да.Но это очень простая инструкция группировки, и у меня возникает проблема группировки, которая является способом huger и более сложной, 20 объединений, 15 групп группировки .... Моя проблема заключается в том, что в сложных запросах данное решение действительно не удовлетворяет. Он имеет плохую производительность и является хрупким и подверженным ошибкам, так как вы должны снова подключиться. Кроме того, сложность также сложна. – Luinil