Teradata的"implicit JOIN"的语法转换规则是什么?
What are the syntax transformation rules of Teradata's "implicit JOIN"?
鉴于此架构:
create table t (i int, j int);
create table u (i int, j int);
insert into t values (1, 1);
insert into t values (2, 2);
insert into u values (1, 1);
insert into u values (2, 1);
在 Teradata 中可以写入以下内容:
select * from t where t.j = u.j;
这似乎隐式地将 u
table 添加到 table 列表中。实际执行的是这样的:
select t.* from t, u where t.j = u.j;
都在生产
|i |j |
|---|---|
|1 |1 |
|1 |1 |
无论使用此功能是否是个好主意(我认为它不是),我似乎都无法在文档中找到对它的任何引用。文档似乎总是使用后一种语法。
我的问题是:
- 这种“隐式连接”叫什么? (大多数人将输出版本称为“隐式连接”,因为它不使用 ANSI JOIN 语法),所以在这里,我指的是这种“双重隐式连接”...
- 它的确切句法规则是什么?
Teradata 开发始于 1979 年,在 70 年代还没有标准 SQL。其中一种查询语言是 QUEL,它是由著名的 Postgres 之父 Michael Stonebraker 设计的。它首先在 Postgres 的前身 Ingres 中实现(Post-Ingres 最初使用 POSTQUEL)。 Teradata 实现被命名为 TEQUEL,没有 FROM。
这是 TEQUEL 语法并且仍然有效:
RETRIEVE t.j;
您的 select 混合了 TEQUEL 和 SQL,即使这样也有效:
select t.* where t.j = u.j;
它包含解析器解析 table 名称和列名称的足够信息。
当解析器遇到未知的 table 名称时,它会在当前默认数据库和此查询中完全限定对象引用的所有数据库中搜索。
参见 Unqualified Object Names
Teradata 从来不敢删除旧的遗留语法,我希望有一个标志可以将其关闭。
鉴于此架构:
create table t (i int, j int);
create table u (i int, j int);
insert into t values (1, 1);
insert into t values (2, 2);
insert into u values (1, 1);
insert into u values (2, 1);
在 Teradata 中可以写入以下内容:
select * from t where t.j = u.j;
这似乎隐式地将 u
table 添加到 table 列表中。实际执行的是这样的:
select t.* from t, u where t.j = u.j;
都在生产
|i |j |
|---|---|
|1 |1 |
|1 |1 |
无论使用此功能是否是个好主意(我认为它不是),我似乎都无法在文档中找到对它的任何引用。文档似乎总是使用后一种语法。
我的问题是:
- 这种“隐式连接”叫什么? (大多数人将输出版本称为“隐式连接”,因为它不使用 ANSI JOIN 语法),所以在这里,我指的是这种“双重隐式连接”...
- 它的确切句法规则是什么?
Teradata 开发始于 1979 年,在 70 年代还没有标准 SQL。其中一种查询语言是 QUEL,它是由著名的 Postgres 之父 Michael Stonebraker 设计的。它首先在 Postgres 的前身 Ingres 中实现(Post-Ingres 最初使用 POSTQUEL)。 Teradata 实现被命名为 TEQUEL,没有 FROM。
这是 TEQUEL 语法并且仍然有效:
RETRIEVE t.j;
您的 select 混合了 TEQUEL 和 SQL,即使这样也有效:
select t.* where t.j = u.j;
它包含解析器解析 table 名称和列名称的足够信息。
当解析器遇到未知的 table 名称时,它会在当前默认数据库和此查询中完全限定对象引用的所有数据库中搜索。 参见 Unqualified Object Names
Teradata 从来不敢删除旧的遗留语法,我希望有一个标志可以将其关闭。