我是Microsoft SQL Server 2008的新手。我需要一些帮助来从多个具有相同数据类型的列的表中检索数据。
目前我的数据库中有多个表,每个表包含一天的数据。例如,我有以下表格:
所有表都具有相同的数据类型相同的列:
现在,是否可以使用单个查询从所有表中检索列。
我正在寻找的是得到column_3的计数,对于所有表,它将按column_1分组。我想避免编写多个查询,因为我需要获取整个月的数据,即30个表。
答案 0 :(得分:1)
正如评论所说,最好将其组织到一个表中,然后添加一个日期列,以便您可以看到每行添加的时间。您甚至可以将date_created
列的默认值设置为getdate()
。
要将所有数据放在一起,请将UNION
运算符与insert语句结合使用到新的更好的表中。
CREATE TABLE Better_Table (Column_1 <type>, Column_2 <type>, ..., Date_Created DateTime2(7) Default GETDATE())
GO
INSERT INTO Better_Table (Column_1, Column_2, ...)
SELECT *, '2016/08/22' FROM Table_20160822
UNION
SELECT *, '2016/08/23' FROM Table_20160823
...
完成此操作后,您的查询将变得更加简单:
SELECT Column_1, COUNT(Column_3)
FROM Better_Table
WHERE date_created >= '2016/08/01'
AND date_created < '2016/09/01'
GROUP BY Column_1
虽然您仍然可以通过group by
查询中的union运算符在db current state中执行此操作。它看起来像这样:
SELECT a.column_1, COUNT(a.column_3)
FROM (
SELECT column_1, Column_3
FROM Table_20160822
UNION ALL
SELECT column_1, Column_3
FROM Table_20160823
) a
GROUP BY a.Column_1
只需将其扩展到您需要抓取的表格。
答案 1 :(得分:0)
您可以使用CTE获取所需的所有日期,然后创建查询并执行它:
DECLARE @dateStart datetime = '2016-08-01',
@dateFinish datetime = '2016-09-01',
@query nvarchar(max)
;WITH cte as (
SELECT @dateStart as d
UNION ALL
SELECT DATEADD(day,1,d)
FROM cte
WHERE DATEADD(day,1,d) < @dateFinish
)
SELECT @query = (
SELECT 'SELECT column_1, COUNT(column_3) FROM ( '
+ STUFF((
SELECT ' UNION ALL SELECT * FROM [Table_'+CONVERT(nvarchar(8),d,112)+'] '
FROM cte
FOR XML PATH('')
),1,10,'') + ') as t GROUP BY column_1 '
FOR XML PATH('')
)
PRINT @query
EXEC sp_executesql @query
@query
变量的输出:
SELECT column_1, COUNT(column_3)
FROM (
SELECT * FROM [Table_20160801] UNION ALL
SELECT * FROM [Table_20160802] UNION ALL
SELECT * FROM [Table_20160803] UNION ALL
SELECT * FROM [Table_20160804] UNION ALL
....
SELECT * FROM [Table_20160831]
) as t
GROUP BY column_1
答案 2 :(得分:0)
如上所述,这是一个糟糕的设计,如果设计在第一时间固定就会很好。这是技术债务,必须迟早收回。无论如何,这是你如何做到的:
DECLARE @dtStartDate DATE,
@dtEndDate DATE,
@nvchTablePrefix NVARCHAR(50),
@nvchQuery NVARCHAR(max)
SELECT @dtStartDate = '20160801',
@dtEndDate = '20160831',
@nvchTablePrefix = 'Table_'
CREATE TABLE #temp
(name NVARCHAR(100))
WHILE(@dtStartDate <= @dtEndDate)
BEGIN
INSERT INTO #temp
SELECT ' SELECT column_1, column_3 FROM ' + @nvchTablePrefix + CONVERT(NVARCHAR,@dtStartDate,112)
SELECT @dtStartDate = DATEADD(d,1,@dtStartDate)
IF (@dtStartDate <= @dtEndDate)
INSERT INTO #temp
SELECT ' UNION '
END
SELECT @nvchQuery = 'SELECT column_1, COUNT(column_3) as column3count FROM ( '
SELECT @nvchQuery = @nvchQuery + name FROM #temp
SELECT @nvchQuery = @nvchQuery + ') t GROUP BY column1'
PRINT @nvchQuery
EXEC sp_executesql @nvchQuery
DROP TABLE #temp
print语句的输出将类似于 -
SELECT column_1, COUNT(column_3) as column3count
FROM
( SELECT column_1, column_3 FROM Table_20160801
UNION
SELECT column_1, column_3 FROM Table_20160802
UNION
....
UNION
SELECT column_1, column_3 FROM Table_20160831
) t GROUP BY column1