从 Select-Statements 重建 Create-Table-statement

Posted

技术标签:

【中文标题】从 Select-Statements 重建 Create-Table-statement【英文标题】:Reconstruct Create-Table-statement from Select-Statements 【发布时间】: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? 【参考方案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语句涉及到一些业务逻辑。

以上是关于从 Select-Statements 重建 Create-Table-statement的主要内容,如果未能解决你的问题,请参考以下文章

从线性深度重建世界位置

从单张图重建三维人体模型综述

使用立体相机从视差图进行深度重建

从多个 2D 点重建 3D 点?

如何创建SSIS脚本任务以从平面文件中删除CR LF

如何从原始字节重建 PCM 样本?