【问题标题】:Select * from n tables从 n 个表中选择 *
【发布时间】:2011-11-25 07:31:26
【问题描述】:

有没有办法编写如下查询:

select * from <some number of tables>

...表的数量是未知的?我想避免使用动态 SQL。我想从所有(表)具有特定前缀的表中选择所有行:

select * from t1
select * from t2
select * from t3
...

我不知道t(n) 可能有多少(可能是1,可能是20,等等)t 表列结构不一样。其中一些有 2 列,其中一些有 3 或 4 列。

使用动态 SQL 并不难,但我想知道是否有办法使用 sys.tables 之类的方法来做到这一点。

更新

基本数据库设计说明

N 家公司将注册/登录我的应用程序

每家公司将建立一张 x 列的表

(x 取决于公司的业务类型,可以不同,例如考虑两家公司:一家是木匠,另一家是报纸)

每家公司都将使用我构建的 API 填写自己的表格

我如何处理数据:

我有一个“处理器”,可以是 SQL 或 C# 或其他。

如果一家公司至少有一行,我将在 COMMON 表中生成一条记录。

所以最终的结果都会在一张表中。

来自这 N 个公司中的任何一个的任何人都将登录并看到为他自己的公司过滤的 COMMON 表。

【问题讨论】:

  • 如果你的表被称为t(number here),你真的应该考虑不同的数据库设计。
  • 通常情况下,对您实际尝试解决的问题的描述将有助于我们为您提供帮助。
  • 您应该将同一类型公司的所有条目放在同一个表中,而不是让每个公司设置自己的表 - 为 Company ID 添加一列(您将无论如何想要,我希望)。理想情况下,Common 表应该已经存在,其中包含所有公司共有的信息 - 仅将 type 表用于特定于该业务类型的其他列。
  • X-Zero,你的想法听起来不错,但对我来说不够动态。我不知道我会有多少种公司类型,也就是说我将拥有 M 种类型的公司,而不是 N 种公司

标签: sql sql-server sql-server-2005 sql-server-2008 dynamic


【解决方案1】:

如果没有动态 SQL,就无法做到这一点。并且拥有不同的表结构根本没有帮助。

更新

没有简单的方法可以在一个结果集中返回所需的输出(结果集至少具有与大多数列相同的表列数,甚至无法让我开始了解数据类型的兼容性) .

但是,您应该检查@KM. 的答案。这将带来多个结果集。

【讨论】:

    【解决方案2】:

    列出您可以尝试的所有表格:

    EXEC sp_msforeachtable 'SELECT * FROM  ?'
    

    您可以通过执行以下操作来实现包括/排除表的可编程性:

    EXEC sp_msforeachtable 'IF LEFT(''?'',9)=''[dbo].[xy'' BEGIN SELECT * FROM  ? END ELSE PRINT LEFT(''?'',9)'
    

    【讨论】:

    • +1 这真的很棒。但是 OP 应该知道结果将带来 多个 结果集,而不是一个单一的结果集。 OP 在以编程方式访问结果时必须考虑到这一点。
    • 我喜欢这个,多个结果集没问题,这是我的想法,但是因为性能,我想我会寻找一种方法让它在没有动态 SQL 的情况下工作
    • 关于已接受答案的一个警告词是 sp_msforeachtable 未记录在案,因此理论上 Microsoft 可以在未来的 SQL Server 更新中更改或完全删除它而不会发出警告。
    猜你喜欢
    • 2011-03-22
    • 2021-12-15
    • 1970-01-01
    • 2012-02-27
    • 2015-01-29
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多