【问题标题】:Reconstruct Create-Table-statement from Select-Statements从 Select-Statements 重建 Create-Table-statement
【发布时间】:2015-12-18 04:33:48
【问题描述】:

问题

是否有任何工具或 API 可以进行以下转换/转换

输入: 任意复杂度的 Select 语句(例如,可以包含多个连接、联合等 pp.),例如 SELECT x, y, z FROM A LEFT JOIN B on A.p = B.p LEFT JOIN C on B.q = C.q

输出:创建所有必要表的 Create 语句。


背景:

我有 50 多个选择语句需要为其生成表。这是一项有点乏味的任务。

其他问题

我认为自动化是可能的。如果我对这个假设有误,请纠正我,并在无法自动化的情况下提供解释。我知道 Select 语句可能缺少真实数据库所拥有的信息。

【问题讨论】:

  • 想想如何在逻辑上做到这一点,然后弄清楚如何构建一个复制该逻辑的 SQL 解析器(考虑函数、聚合、别名等)。这可能是可能的,但超出了范围这个论坛的。
  • 这无法完成。如何找到未选择的列?如何确定 x 属于哪个表列?如何确定数据类型和各种约束?
  • @jarlh 1.) 如果未选择列,则创建语句将不包含该列(如我所说,缺少信息)。 2.) 在上面的示例语句中,x 列显然属于表A。 3.) 在上面的 Select-statement 中,由于缺少信息,Create-statements 不考虑数据类型或约束,并将所有内容创建为 varchar(例如)。
  • 你怎么说“在上面的示例语句中,列 x 显然属于表 A”?列可以按任何顺序排列。
  • @DStanley 当然是在论坛之外。问题是:在 Java 或任何其他语言中是否有用于此任务的 API?

标签: sql select create-table


【解决方案1】:

这样做的问题是您没有相关信息来创建表格。你必须做出很多假设

您缺少以下信息:

  • 数据类型CHAR(10), INT, BIT
  • 约束NOT NULL, DEFAULT()
  • 索引信息

...这只是开始,并不是每个查询都会列出所有字段,并且您可能会发现下次引用表时您遗漏了一些内容 - 那您会怎么做??

做到这一点的唯一方法是,如果您有非常好的脚本编码标准。 例如:

  • 所有名为Modified 的列的类型均为DATETIME NOT NULL
  • 所有主键都采用表名加上 ID,例如。 TablenameID INT IDENTITY(1,1) PRIMARY KEY NOT NULL(您也可以使用CONSTRAINT 选项来创建具有特定名称的密钥)

...你明白了。

我会硬着头皮继续手动操作。

编辑

真正的问题是你为什么要这样做?确定查询是针对现有数据库创建的吗?

您是从一个 RDBMS 迁移到另一个 RDBMS 的情况吗?

【讨论】:

  • 实际上,我正在扩展一个应用程序,它通过查询数据库和创建 Excel 表格来进行概念验证。这些SQL语句涉及到一些业务逻辑。
猜你喜欢
  • 2011-08-20
  • 2013-06-29
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 2020-02-08
相关资源
最近更新 更多