【问题标题】:SQL Server retrieve list of rows inside another list of rows from databaseSQL Server 从数据库中检索另一个行列表中的行列表
【发布时间】:2016-04-27 14:40:26
【问题描述】:

这听起来也很容易混淆和容易。但是我尝试了几种方法都没有成功

现在我有一张表User 包含这些列

  • 身份证
  • 用户ID
  • 文件ID
  • 文字

还有一张桌子File

  • 身份证
  • 文件名

还有第三张桌子UserDetails

  • 身份证
  • 姓名
  • 姓氏

User & File 使用外键 FileId 链接以匹配 Id 同样UserUserDetails 与外键UserIdId 链接。

所以我在 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 关联,即UserUserdetails 具有一对一的关系。

但是UserFile是一对多的关系,所以每个User可以有多个文件。

如何为每个用户检索这些文件?

像这样的

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

【问题讨论】:

    标签: sql-server foreign-keys sql-view data-retrieval multiple-records


    【解决方案1】:
    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
    

    【讨论】:

    • 嘿德瓦特!感谢您的代码,但如果您能解释一下您所做的事情,我将不胜感激。因为我一无所知。为什么要在文本和文件周围加上“[]”。请进一步指导。
    • 首先,请检查ROW_COUNT...我们只是按每个用户计算行数,并且只为第一行提供值。 [] 只是一个很好的代码风格...为系统词使用配额,如 tablecolumntext
    • 嘿,这并没有完全按照我想要的方式工作,但谢谢。 :)
    【解决方案2】:

    我使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      相关资源
      最近更新 更多