Sql Teradata的“隐式连接”的语法转换规则是什么?

Sql Teradata的“隐式连接”的语法转换规则是什么?,sql,teradata,Sql,Teradata,鉴于此模式: 创建表ti int,j int; 创建表u i int,j int; 插入t值1,1; 插入t值2,2; 插入u值1,1; 插入u值2,1; 在Teradata中,可以编写以下内容: 从t中选择*其中t.j=u.j; 它似乎隐式地将u表添加到表列表中。实际执行的是: 从t,u中选择t.*,其中t.j=u.j; 都生产 |i|j| |--|--| |1 |1 | |1 |1 | 无论使用此功能是否是一个好主意,我认为它不是,我似乎在文档中找不到任何参考。文档似乎总是使用后一种

鉴于此模式:

创建表ti int,j int; 创建表u i int,j int; 插入t值1,1; 插入t值2,2; 插入u值1,1; 插入u值2,1; 在Teradata中,可以编写以下内容:

从t中选择*其中t.j=u.j; 它似乎隐式地将u表添加到表列表中。实际执行的是:

从t,u中选择t.*,其中t.j=u.j; 都生产

|i|j| |--|--| |1 |1 | |1 |1 | 无论使用此功能是否是一个好主意,我认为它不是,我似乎在文档中找不到任何参考。文档似乎总是使用后一种语法

我的问题是:

这种隐式连接称为什么?大多数人称输出版本为隐式连接,因为它不使用ANSI连接语法,所以在这里,我指的是这种双隐式连接。。。 它的确切语法规则是什么?
Teradata开发始于1979年,70年代还没有标准的SQL。其中一种查询语言是QUEL,由著名的博士后之父Michael Stonebraker设计。它首先在Ingres实现,Postgres的前身Post Ingres最初使用POSTQUEL。Teradata实现被命名为TEQUEL,并且没有来自

这是TEQUEL语法,仍然有效:

RETRIEVE t.j;
您的select混合了TEQUEL和SQL,即使如此:

select t.* where t.j = u.j;
它包含足够的信息供解析器解析表名和列名

当解析器遇到未知的表名时,它将在当前默认数据库以及此查询中完全限定对象引用的所有数据库中进行搜索。 看


Teradata从来不敢删除旧的遗留语法,我希望有一个标志来关闭它。

Nice one+1,我被难住了。我还想知道这个特性是否曾经是某些SQL ANSI标准的一部分。@TimBiegeleisen很想知道!显然,它在旧的PostgreSQL版本中也得到了支持:文档中的PostgreSQL add_missing_有,但是,这种行为不是SQL标准,许多人不喜欢它,因为它可以掩盖错误,例如引用本应引用其别名的表。对于拒绝对未在中列出的表的引用的SQL标准行为,设置为false。我以前从未听说过它,所以我认为它从来都不是任何旧SQL标准的一部分。很有趣,感谢历史课,非常感谢:但是,我不明白链接的非限定对象名称部分是如何解释这种行为的。它说,因为数据库名和表名可以从from子句中的personal.Employee引用派生,所以它仍然假设标准SQL行为,其中from子句中的表声明是必需的。例如,它没有提到将表添加到构成笛卡尔积的FROM子句中……下面的部分省略了数据库名称。manuls中几乎没有不推荐的TEQUEL语法。我阅读该部分的方式,这只是解释了当FROM子句中的表不符合数据库条件时会发生什么,例如Employee而不是Personal。Employee。。。当然,这也适用于我的示例,其中t和u也不符合数据库的条件。它没有明确提到FROM中的对象:-它没有明确提到通过向FROM添加对象来创建笛卡尔积!