Join 平面文件的多对一连接帮助
我不确定是否已经有人问过这个问题——我四处看了好一会儿,但什么也没找到 我的最终结果是将多个SQL数据库表中的数据获取到一个逗号分隔的平面文件中。通常情况下,这不会是一个问题,但由于他们的多对一关系以及我被迫使用的格式,事实证明这是一个问题 首先,我有一个表,报告表,它包含了报告的所有基本信息。比如说Join 平面文件的多对一连接帮助,join,one-to-many,flat-file,flat,Join,One To Many,Flat File,Flat,我不确定是否已经有人问过这个问题——我四处看了好一会儿,但什么也没找到 我的最终结果是将多个SQL数据库表中的数据获取到一个逗号分隔的平面文件中。通常情况下,这不会是一个问题,但由于他们的多对一关系以及我被迫使用的格式,事实证明这是一个问题 首先,我有一个表,报告表,它包含了报告的所有基本信息。比如说 CREATE TABLE tblReportExample ( ReportID int, ReportMonth smalldatetime, ReportDetails
CREATE TABLE tblReportExample
(
ReportID int,
ReportMonth smalldatetime,
ReportDetails varchar(500)
)
第二,我有另外一张表格,上面有每个报告的案例
CREATE TABLE tblReportCasesExample
(
ReportID int,
ReportCase varchar(50)
)
第三,我有一个平面文件定义,包含以下内容:
ReportID,
报告月,
报告详情,
报告案例1,
报告案例2,
报告案例3
我需要做的是添加从TBLReportCaseSample中获取报告的前三个案例,以某种方式将其与tblReportExample中的数据连接起来,并将其作为报告案例1、2和3添加到平面文件中
我整天都在看这件事,就是想不出来
有什么想法吗?请确保您在此处使用了正确的ID。我不明白你在追求什么 据我所知,您的问题是以下两个问题之一: 一,。 单个报告指向多个案例 案例可以分配给多个报告 这需要多对多的连接 二,。 单个报告指向多个案例 可以将单个案例分配给单个报告 这是一对多
在第二点中,我看不出是什么原因造成了问题,请详细说明。请确保您在这里使用了正确的ID。我不明白你在追求什么 据我所知,您的问题是以下两个问题之一: 一,。 单个报告指向多个案例 案例可以分配给多个报告 这需要多对多的连接 二,。 单个报告指向多个案例 可以将单个案例分配给单个报告 这是一对多
在第二点中,我看不出是什么导致了问题,请详细说明。案例表中的ReportID与报告表中的ReportID相同。场景2是我的问题。我可以找到一个左撇子加入的案例,但找不到一个创造性的方法来找到另外两个:
SELECT re.ReportID, re.ReportMonth, re.ReportDeails, rce.ReportCase
FROM tblReportExample re
LEFT OUTTER JOIN tblReportCasesExample rce
ON(re.ReportID = rce.ReportID)
案例表中的ReportID与报告表中的ReportID相同。场景2是我的问题。我可以找到一个左撇子加入的案例,但找不到一个创造性的方法来找到另外两个:
SELECT re.ReportID, re.ReportMonth, re.ReportDeails, rce.ReportCase
FROM tblReportExample re
LEFT OUTTER JOIN tblReportCasesExample rce
ON(re.ReportID = rce.ReportID)
您只需将更多案例添加到案例表中,并添加一个id来区分它们:
CREATE TABLE tblReportCasesExample
(
CaseID int,
ReportID int,
ReportCase varchar(50)
)
引起我困惑的是您为什么需要文本文件?您只需将更多案例添加到案例表中,并添加一个id来区分它们:
CREATE TABLE tblReportCasesExample
(
CaseID int,
ReportID int,
ReportCase varchar(50)
)
引起我困惑的是您为什么需要文本文件?建议更新您的问题:不仅仅是“平面文件”,而是“CSV文件”。据推测,CSV文件是导出到另一个系统,或者只是导出到喜欢在Excel中查看内容的人:-) 另一个来自一位老前辈的评论(意思是,做了很多文件传输系统集成工作的sombody):并不是所有的世界都是SQL数据库。特别是如果任务不需要“ACID”(除了围绕初始提取的事务) 将两个表的(相关部分)转储到一对CSV文件中。然后“按程序”组装最终的CSV文件。实用的提取和报告语言(又称“perl”)是解决这类问题的好工具,但还有其他工具 将“tblReportCasesExample”数据读入某种索引数据结构 遍历“tblReportExample”数据:
- 选择您最喜欢的tblReportCasesExample条目
- 转储tblReportExample字段,然后从相关tblReportCasesExample行/行中选择(键)值
需要更多细节/注意吗?建议更新您的问题:不仅仅是“平面文件”,而是“CSV文件”。据推测,CSV文件是导出到另一个系统,或者只是导出到喜欢在Excel中查看内容的人:-) 另一个来自一位老前辈的评论(意思是,做了很多文件传输系统集成工作的sombody):并不是所有的世界都是SQL数据库。特别是如果任务不需要“ACID”(除了围绕初始提取的事务) 将两个表的(相关部分)转储到一对CSV文件中。然后“按程序”组装最终的CSV文件。实用的提取和报告语言(又称“perl”)是解决这类问题的好工具,但还有其他工具 将“tblReportCasesExample”数据读入某种索引数据结构 遍历“tblReportExample”数据:
- 选择您最喜欢的tblReportCasesExample条目
- 转储tblReportExample字段,然后从相关tblReportCasesExample行/行中选择(键)值
需要更多详细信息/注意吗?我还没有在MS SQL Server上测试过这一点(我从您使用的
smalldatetime
数据类型中推断出来),但我已经看过一些文章,介绍了您可以使用FOR XML PATH
的技巧
SELECT r.*,
(SELECT TOP 3 c.ReportCase + ',' AS [text()]
FROM tblReportCasesExample c
WHERE c.ReportId = r.ReportId
FOR XML PATH('')
) AS ReportCaseList
FROM tblReportExample r;
结果应该包含tblReportExample列,以及前三个报告案例的逗号分隔字符串。然后,在CSV文件中,您可能不知道某些逗号是该字符串的一部分,而不是分隔列。:-) 我还没有在MS SQL Server上测试过这一点(我从您使用的
smalldatetime
数据类型中推断出这一点),但我看到了一些关于这一点的文章