1

Это может показаться запутанным и легким. Но я попробовал несколько способов, и это не сработалоSQL Server извлекает список строк из другого списка строк из базы данных

Теперь у меня есть таблица User с этими столбцами

  • Id
  • UserId
  • FILEID
  • Текст

и другая таблица File

  • Id
  • Имя файла

и третий стол UserDetails

  • Id
  • Имя
  • LastName

User & File связаны с использованием внешнего ключа FileId в соответствие с Id аналогично User и UserDetails связаны с внешним ключом UserId и Id.

Так что я создал представление в SQL:

CREATE VIEW [dbo].[vw_NewView] AS 
    SELECT 
     U.Text as Text, 
     UD.Name + ' ' + UD.LastName AS FullName 
    FROM 
     User U 
    LEFT OUTER JOIN 
     dbo.UserDetails UD on UD.Id = U.UserId 

Теперь я получаю результирующий набор:

Text  FullName 
entry 1 NAme1 
entry 2 Name2 

Примечание: каждый User будет связан с одним UserDetails, т.е. User имеет одно- к-одному с Userdetails.

Но User имеет отношения «один ко многим» с File, поэтому каждый User может иметь несколько файлов.

Как я могу получить эти файлы для каждого пользователя?

Что-то вроде этого

Text  FullName FileName 
entry 1 NAme1  File1 
        File2 
entry 2 Name2  File1 
        File2 
        File3 

ответ

0

Я использовал Stuff, чтобы получить желаемый результат, то ниже код.

CREATE VIEW [dbo].[vw_NewView] AS 
    SELECT 
     U.Text as Text, 
     UD.Name + ' ' + UD.LastName AS FullName, 
    SUBSTRING(
      (
       SELECT ','+CAST(U.Id AS VARCHAR) +'_'+F.FileName AS [text()] 
       FROM File F 
       WHERE U.Id = F.NoteId 
       ORDER BY U.Id 
       FOR XML PATH ('') 
      ), 2, 1000) [FileName] 
    FROM 
     User U 
    LEFT OUTER JOIN 
     dbo.File F on UD.Id = U.NoteId 

    GO 

Это работало для меня. Получил мой ответ как строку значений, разделенных запятыми.

выход:

Text  FullName FileName 
entry 1 NAme1  File1,File2 
entry 2 Name2  File1,File2,File3 
0
CREATE VIEW [dbo].[vw_NewView] AS 
    SELECT 
     [Text] = CASE WHEN RowNum = 1 THEN [Text] END, 
     FullName = CASE WHEN RowNum = 1 THEN Name + ' ' + LastName END, 
     [File] 
    FROM (
     SELECT 
      U.[Text], 
      UD.Name, 
      UD.LastName, 
      F.[File], 
      RowNum = ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY FileID) 
     FROM dbo.[User] U 
     LEFT JOIN dbo.UserDetails UD on UD.Id = U.UserId 
     LEFT JOIN dbo.[File] F ON F.FileID = UD.FileID 
    ) t 
+0

Эй Devart!спасибо за код, но я был бы признателен, если бы вы могли объяснить, что вы сделали .., поскольку я не знаю. Почему вы положили «[]» вокруг текста и файла. Дальнейшее руководство. –

+0

Прежде всего, пожалуйста, проверьте «ROW_COUNT» ... мы просто подсчитываем строки каждому пользователю и предоставляем значения только для первой строки. '[]' просто хороший стиль кода ... используйте квоту для системных слов, таких как 'table',' column', 'text' и т. д. – Devart

+0

Эй, это точно не работало так, как мне хотелось, но спасибо. :) –

Смежные вопросы