我正在尝试从一个数据库中的所有表中获取所有数据。 我环顾四周,但我找不到任何可以解决当前问题的解决方案。
我制作了一个C#程序,它为程序运行的每一天创建一个表。对于今天的日期(丹麦日期格式),表名将类似于tbl18_12_2015。
现在,为了制作年度报告,如果我可以从存储这些报告的数据库中的所有表中获取所有数据,我会很高兴。除了格式(tblDD-MM-YYYY)之外,我无法知道将会有多少个表或者它们被称为什么。
在思考这样的事情时(显然不会起作用)
SELECT * FROM DB_NAME.*
所有表都具有相同的列,其中一个是主键,自动递增。
这是一个名为tbl17_12_2015
的表ID PERSONID NAME PAYMENT TYPE RESULT TYPE
3 92545 TOM 20,5 A NULL NULL
4 92545 TOM 20,5 A NULL NULL
6 117681 LISA NULL NULL 207 R
这是一个名为tbl18_12_2015
的表ID PERSONID NAME PAYMENT TYPE RESULT TYPE
3 117681 LISA 30 A NULL NULL
4 53694 DAVID 78 A NULL NULL
6 58461 MICHELLE NULL NULL 207 R
我想得到的是这样的(来自数据库中的所有表格):
PERSONID NAME PAYMENT TYPE RESULT TYPE
92545 TOM 20,5 A NULL NULL
92545 TOM 20,5 A NULL NULL
117681 LISA NULL NULL 207 R
117681 LISA 30 A NULL NULL
53694 DAVID 78 A NULL NULL
58461 MICHELLE NULL NULL 207 R
尝试了一些不同的查询,但没有一个返回此信息,只是关于表格的大量信息。
提前致谢,节日快乐
编辑:更正了tbl18_12_2015 col 3标题为英语而非丹麦语
感谢所有那些试图帮我解决这个问题的人,但我不能(因为我的技能设置最有可能)让UNION工作,这就是为什么我决定重构我的数据库。
答案 0 :(得分:3)
虽然您可以将表名存储在数据库中并使用动态sql将它们组合在一起,但这不是一个好主意,您甚至不应该考虑它 - 现在停止!!!!! < /强>
您需要做的是创建一个具有相同字段的新表 - 并添加ID(自动递增标识列)和DateTime字段。然后,不要为每天创建一个新表,而只需使用DateTime将数据写入此表。然后,您可以使用DateTime字段来过滤您的结果,无论您是想要一天,一周,一个月,一年,十年等等 - 而且您不需要动态SQL - 而且您不需要有10,000个数据库表。
我知道有些人发表评论表达同样的观点,但是,实际上,这应该是一个答案。
答案 1 :(得分:0)
如果您拥有同一数据库中的所有表,则可以使用UNION运算符组合所有表。
也许你可以做这样的事情来选择给定数据库中的所有表名
对于SQL Server:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG='dbName'
对于MySQL:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='dbName'
获得表格列表后,您可以将所有表格移动到1个数据库,并使用联盟创建报告。
答案 2 :(得分:0)
您需要在每个选择查询之间使用UNION。
不要使用*,请始终列出您要提出的列的名称。
如果你想要重复,那么UNION ALL就是你想要的。
如果您想要基于PERSONID的唯一记录,但可能存在差异,那么我猜测UPDATE_DATE列将有助于确定使用哪一个但是如果具有相同PERSONID的每个记录都有生命它自己的每一方?
您需要确定业务规则,以确定要保留哪些特定更改并将其合并到唯一的结果记录中,并且您将独立完成。
什么是“Skyttenavn”?是丹麦语吗?如果它与“NAME”相同,则您希望在选择查询中将该列别名为“NAME”,尽管它是列出的列的顺序,在确定要联合的内容时会计算。
顺便说一句,如果您可能存在冲突ID,则需要新的自动递增ID作为唯一主键。如果要将它们合并到一个新的主键标识列中,如果要重新启动自然增量,则需要将IDENTITY_INSERT设置为OFF然后再设置为ON。