我不确定这是否已被问过 - 我四处寻找但找不到任何东西。
我的最终结果是将我的几个SQL数据库表中的数据转换为逗号分隔的平面文件。通常情况下,这不会是一个问题,但由于他们之间存在多对一的关系以及我不得不将其放入其中的格式。
1我有一个表,报告表,其中包含报告的所有基本信息。例如
CREATE TABLE tblReportExample
(
ReportID int,
ReportMonth smalldatetime,
ReportDetails varchar(500)
)
第二,我有另一张表格,上面有每个报告的案例。
CREATE TABLE tblReportCasesExample
(
ReportID int,
ReportCase varchar(50)
)
3rd我有一个平面文件定义,包含以下内容:
ReportID, ReportMonth, ReportDetails, ReportCase1, ReportCase2, ReportCase3
我需要做的是添加来自tblReportCasesExample的前三个案例作为报告,以某种方式将其与tblReportExample中的数据连接,并将其作为ReportCase1,2和3添加到平面文件中。
我一整天都在看这件事,只是想不出来。
有什么想法吗?
答案 0 :(得分:1)
建议更新您的问题:不只是“平面文件”,而是“CSV文件”。据推测,CSV文件是导出到另一个系统,或者只是想要在Excel中查看内容的人: - )
旧计时器的另一个评论(意思是,做过多文件传输系统集成工作的sombody):并非所有的世界都是SQL数据库。特别是如果您不需要“ACID”执行任务(除了初始提取物周围的事务)。
将两个表转储(将相关部分)转换为一对CSV文件。然后“程序性地”组装最终的CSV文件。实用提取和报告语言(又名“perl”)是这类事物的好工具,但还有其他语言。
将“tblReportCasesExample”数据读入某种索引数据结构。
迭代“tblReportExample”数据:
选择您喜欢的“最喜欢的”tblReportCasesExample条目
转储tblReportExample字段,然后转储相关tblReportCasesExample行/行中的select(键)值。
如果数据中有任何特殊字符,请查找CSV处理库。否则,只需使用“split”(perl和java都有这样的东西,我怀疑.NET库也可以。)
需要更多细节/关心吗?
答案 1 :(得分:0)
请确保您在此处使用了正确的ID。我对你所追求的事感到困惑。
我可以理解你的问题是这两个中的一个:
1。 单个报告指向多个案例 案例可以分配给多个报告
这需要多对多连接。
2。 单个报告指向多个案例 单个案例可以分配给单个报告
这是一对多
在第二点,我看不出是什么原因造成你的麻烦,请详细说明。
答案 2 :(得分:0)
案例表中的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)
答案 3 :(得分:0)
您只需要在案例表中添加更多案例,并添加一个ID来区分它们:
CREATE TABLE tblReportCasesExample
(
CaseID int,
ReportID int,
ReportCase varchar(50)
)
导致我混淆的原因是你需要文本文件吗?
答案 4 :(得分:0)
我没有在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文件中,您不会知道某些逗号是该字符串的一部分而不是分隔列。 : - )