具有给定名称匹配字符串的每个表的数据

时间:2014-03-04 19:47:39

标签: sql sql-server-2008

在我的数据库中有许多名称相似的表; abc-123,abc-245,abc-246等 这些表中的每一个都有一个带有每个记录的日期字段,称为samplesate。我想找到每个表中最早的记录,其名称与'abc-%'相匹配。我可以单独获取它们,但必须有一种简单的方法从一组表中选择数据!

2 个答案:

答案 0 :(得分:0)

你想要的是一个UNION查询。 UNION将两个或多个查询的结果组合到一个结果集中,该结果集包括属于联合中所有查询的所有行。 UNION操作与使用组合来自两个表的列的连接不同。

示例:

SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name

http://technet.microsoft.com/en-us/library/ms180026.aspx

答案 1 :(得分:0)

我要做的是编写一个写查询的查询(又名“编写代码的代码”)。例如,此初始查询应生成一个tsql语句,该语句将为您提供所需的最终数据。 根据需要调整WHERE子句:

SELECT 'SELECT ''[' + c.TABLE_SCHEMA + '].[' + c.TABLE_NAME + ']'' AS TableName, MAX(SampleDate) AS MaxDate FROM [' + c.TABLE_SCHEMA + '].[' + c.TABLE_NAME + '] UNION ALL'
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.TABLE_NAME LIKE 'ABC-%'
AND c.COLUMN_NAME = 'SampleDate'

如果你在SSMS中,如果将输出设置为文本(CTRL + T),则会更容易一些。运行查询后,您将在输出窗口中看到与此类似的内容:

SELECT '[dbo].[ABC-123]' AS TableName, MAX(SampleDate) AS MaxDate FROM [dbo].[ABC-123] UNION ALL
SELECT '[dbo].[ABC-456]' AS TableName, MAX(SampleDate) AS MaxDate FROM [dbo].[ABC-456] UNION ALL
SELECT '[dbo].[ABC-78]' AS TableName, MAX(SampleDate) AS MaxDate FROM [dbo].[ABC-78] UNION ALL
SELECT '[dbo].[ABC-90]' AS TableName, MAX(SampleDate) AS MaxDate FROM [dbo].[ABC-90] UNION ALL

复制&将输出粘贴到新窗口中。从最后一行删除“UNION ALL”,然后运行查询。