SQL JOIN来自一个数据的所有表

时间:2015-12-18 15:24:53

标签: sql-server

我正在尝试从一个数据库中的所有表中获取所有数据。 我环顾四周,但我找不到任何可以解决当前问题的解决方案。

我制作了一个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工作,这就是为什么我决定重构我的数据库。

3 个答案:

答案 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。