【问题标题】:View that displays all rows from tables returned by separate query显示由单独查询返回的表中的所有行的视图
【发布时间】:2016-06-09 09:16:48
【问题描述】:

需要显示来自多个表的所有行。要包含的表将来自单独的查询以确保。所以我们知道数据的来源,必须添加一个包含表名的新列。

要包含在其中的表必须是动态的,以减少维护,因此会自动包含新创建的表。 要选择我创建此查询的表:

select TABLE_NAME
from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME = 'contact_info_type' 
and TABLE_NAME NOT LIKE '%test%' 
and TABLE_NAME NOT LIKE '%_STAGING'

'contact_info_type' 列的测试是为了确保该表具有预期的结构。所有这些表都完全相同。

但是如何将这些结果传递到新的 select 语句中呢?

我尝试了这个,它产生了重复的结果并且不会停止处理。它还缺少在表名中添加的额外列

declare @tableNames nvarchar(max)
select  @tableNames = COALESCE(@tableNames + ', ', '')  + Cast(TABLE_NAME as varchar) from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME = 'contact_info_type' and TABLE_NAME not like '%_STAGING' and TABLE_NAME like '%test%'
select @tableNames
declare @sqlText nvarchar(max)
set @sqlText = ''
select @sqlText = @sqlText + 'SELECT * from ' + @tableNames where person = 'Joe'
select @sqlText

每个表将包含几千行,但条件 (name = 'Joe') 会将结果限制在 100 左右。

运行 Server 2008 R2 SP3 (10.50)。

【问题讨论】:

  • distinct table_name?
  • 您的意思是说所有表结构都将完全相同。包含列contact_info_type 的所有表都必须包含在此查询中。您需要额外的列来说明它属于哪些行。如果是这种情况那么这可以做到。但首先你要做什么?你真正的要求是什么,你为什么要创建这么多表。
  • @KumarHarsh 是的,所有表都具有完全相同的结构。这是我们正在使用的第 3 方系统,它是这样设计的。这个想法是它使用单独的表来保持数据隔离。由于所有这些表的结果将在一个结果集中返回,因此需要知道结果来自哪个表,因此需要一个包含该行所属表名称的新列。

标签: sql sql-server


【解决方案1】:

也许这个查询会对你有所帮助,

但是您需要在 @results 表中添加其他列作为您需要的列。

DECLARE @tables TABLE  (tableName VARCHAR(1000), nmbr INT IDENTITY(1,1))
DECLARE @results TABLE (person varchar(500), tablename varchar(1000))
DECLARE @i INT,
    @tableName varchar(1000),
    @sql varchar(500)

INSERT INTO @tables
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = 'contact_info_type' 
    AND TABLE_NAME NOT LIKE '%test%' 
    AND TABLE_NAME NOT LIKE '%_STAGING'

SELECT @i = MAX(nmbr)
FROM @tables AS t

WHILE (@i > 0)
BEGIN

    SELECT @tableName = tablename
    FROM @tables
    WHERE nmbr = @i

    SET @sql = 'SELECT person, '''+@tablename +''' as tablename
                FROM '+ @tableName +'
                WHERE person = ''joe'''

    INSERT INTO @results
    EXEC (@sql)

    SET @i = @i - 1

END

SELECT * FROM @results

【讨论】:

  • 只需要删除“dba_stats.dbo”。在 From 中,这是一种享受。谢谢,我自己永远也想不到这个
  • 糟糕.. 谢谢@oden,我没注意到。我现在将编辑我的帖子。
猜你喜欢
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
相关资源
最近更新 更多