繁体   English   中英

如何在SQL中将三个表中的多行合并为一个字符串?

[英]How to combine multiple rows from three tables into one single string in SQL?

我有三个表,它们根据录入过程存储不同类型的数据。

第一个表([dbo]。[Inscripciones_Pregrado])存储将来学生的基本联系信息。 第二张表([dbo]。[Checklist_Documentos])存储学生完成入学过程所必需的文件的名称和ID。 第三张表([dbo]。[Checklist_Pregrado])存储学生已有效带到招生办公室的文件。

我需要合并此信息,以便我们可以导出包含所有联系信息以及每个学生的文档清单的excel文件。

因此,假设表1有4条记录:[dbo]。[Inscripciones_Pregrado]

在此处输入图片说明

第二个表([dbo]。[Checklist_Documentos])有八条记录,不同类型的请求文件: 在此处输入图片说明

第三张表([dbo]。[Checklist_Pregrado])有16条记录:

在此处输入图片说明

我需要的是将这三个表根据期望者的ID进行合并:

在此处输入图片说明

到目前为止,我已经尝试了不同类型的代码:

代码1

SELECT
    [dbo].[Inscripciones_Pregrado].[ID],
    [dbo].[Inscripciones_Pregrado].[Name],
    [dbo].[Inscripciones_Pregrado].[ProgramID],
    [dbo].[Checklist_Documentos].[Document] 
FROM [dbo].[Inscripciones_Pregrado] 

INNER JOIN
    [dbo].[Checklist_Pregrado]
    ON [dbo].[Checklist_Pregrado].[IdForm] = [dbo].[Inscripciones_Pregrado].[ID]

INNER JOIN
    [dbo].[Checklist_Documentos]
    ON [dbo].[Checklist_Documentos].[ID] = [dbo].[Checklist_Pregrado].[IdDoc]

每个文档每行仅此一行,因此名称和其他记录将根据有抱负者所在文件夹中的文档数进行重复。

代码2

SELECT
    [dbo].[Inscripciones_Pregrado].[ID],
    [dbo].[Inscripciones_Pregrado].[Nombres],
    [dbo].[Inscripciones_Pregrado].[Apellido1],
    (STUFF((SELECT CAST(', ' + [dbo].[Checklist_Pregrado].[IdDocumento] AS varchar(max))
        FROM [dbo].[Checklist_Pregrado]
        WHERE([dbo].[Inscripciones_Pregrado].[ID] = [dbo].[Checklist_Pregrado].[IdForm])
        FOR XML PATH ('')), 1, 2, '')) AS [Docs]
FROM [dbo].[Inscripciones_Pregrado]

此代码获取错误:将varchar值','转换为数据类型int时转换失败。

感谢您的帮助和评论。

谢谢

对于您的Code 2 ,可以在进行串联之前通过执行CAST来修复错误。

换一种说法:

(STUFF((SELECT ', ' + CAST([dbo].[Checklist_Pregrado].[IdDocumento] AS varchar(max))

@Tab Alleman给了我提示的答案,我没有注意到写作中的错误。 它解决了问题,但是代码只能从第二个表中获取文档的ID([dbo]。[Checklist_Documentos]),因此我添加了一个INNER JOIN来合并数据:

SELECT
    [dbo].[Inscripciones_Pregrado].[ID],
    [dbo].[Inscripciones_Pregrado].[Nombres],
    [dbo].[Inscripciones_Pregrado].[Apellido1],
    (STUFF((SELECT ', ' + CAST([dbo].[Checklist_Documentos].[Documento] AS varchar(max))
        FROM [dbo].[Checklist_Pregrado]
        INNER JOIN
            [dbo].[Checklist_Documentos] 
            ON [dbo].[Checklist_Documentos].[ID] = [dbo].[Checklist_Pregrado].[IdDocumento] 
        WHERE([dbo].[Inscripciones_Pregrado].[ID] = [dbo].[Checklist_Pregrado].[IdForm])
        FOR XML PATH ('')), 1, 2, '')) AS [Docs]
FROM [dbo].[Inscripciones_Pregrado]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM