Неверный синтаксис рядом с ключевым словом «FOR», хотя тот же код работал в руководстве - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь свернуть несколько строк в одну с помощью FOR XML PATH.Я не уверен, почему я получил ошибку «Неверный синтаксис рядом с ключевым словом« FOR »»

Я следовал этому руководству: https://www.mssqltips.com/sqlservertip/2914/rolling-up-multiple-rows-into-a-single-row-and-column-for-sql-server-data/

SELECT
    movie.name, movie.date, movie.filelocation, 
    movie.imdb, movie.description,
    STUFF ((SELECT ';' + genre.name 
            FROM genre
            WHERE genre.id = mov_genr.gen_id 
              AND movie.id = mov_genr.mov_id
            FOR XML PATH ('')), 1, 1, '') [genres]
FROM 
    movie
FULL JOIN 
    mov_genr on movie.id = mov_genr.mov_id
FULL JOIN 
    genre on mov_genr.gen_id = genre.id

У меня 3 таблицы, movie с кучей фильмов, mov_genr - это таблица, которая связывает фильмы с жанрами, и genre таблица, которая содержит жанры.

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

Ответы [ 2 ]

0 голосов
/ 01 июня 2019

Ваш код не имеет смысла.Я думаю, вы хотите:

Select m.*,
       STUFF( (SELECT ';' + genre.name
               FROM mov_genr mg JOIN
                    genre g
                    ON g.id = mg.gen_id 
               WHERE m.id = mg.mov_id
               FOR XML PATH ('')
              ), 1, 1, '') as genres
FROM movie m;

Одной из проблем является отсутствие запятой.

Но у вас также есть проблемы с логикой.Вы хотите получить строку для каждого фильма (предположительно), поэтому join s не подходят во внешнем запросе.

Далее FULL JOIN почти никогда не требуется с хорошо разработанной моделью данных.

Псевдонимы таблиц облегчают написание и чтение запроса.

0 голосов
/ 01 июня 2019

Вы пропустили запятую до STUFF:

Select movie.name,movie.date,movie.filelocation, movie.imdb, movie.description, -- here

    STUFF ((SELECT ';' + genre.name FROM genre
    WHERE genre.id = mov_genr.gen_id AND movie.id = mov_genr.mov_id
    FOR XML PATH ('')), 1,1,'') [genres]

FROM movie
FULL JOIN mov_genr on movie.id = mov_genr.mov_id
FULL JOIN genre on mov_genr.gen_id = genre.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...