Module &引用;“线轴外”;Teradata中的错误

Module &引用;“线轴外”;Teradata中的错误,module,teradata,processor,spool,Module,Teradata,Processor,Spool,为什么在联接条件中用实际表名为表和质量别名时会出现“脱离假脱机”错误 比如,; 来自emp_表E的sel名称、ID 内连接 副表D 在…上 emp_表.dep_no=D.dep_no更新:解决评论中的后续问题 当您使用“真实”表名进行限定时,Teradata不会假定您指的是与别名相同的表实例。因此,它交叉连接了emp_table(在您的示例中)的另一个实例,该实例生成的数据一定太多,您的安装无法处理。(即使它运行到完成阶段,也会得到意想不到的结果,因为逻辑根本没有说出你的意思;请参见下文。) 如

为什么在联接条件中用实际表名为表和质量别名时会出现“脱离假脱机”错误

比如,; 来自emp_表E的sel名称、ID 内连接 副表D 在…上 emp_表.dep_no=D.dep_no

更新:解决评论中的后续问题 当您使用“真实”表名进行限定时,Teradata不会假定您指的是与别名相同的表实例。因此,它交叉连接了
emp_table
(在您的示例中)的另一个实例,该实例生成的数据一定太多,您的安装无法处理。(即使它运行到完成阶段,也会得到意想不到的结果,因为逻辑根本没有说出你的意思;请参见下文。)

如果您仔细想想,DBMS将走上一条危险的道路,假设
emp_table.dep_no
引用与
E.dep_no
相同的表实例;那么,它将如何处理这一问题:

SELECT e.id
  FROM            emp_table e
       inner join emp_table m
               on e.manager_id = m.id
 WHERE emp_table.dep_num = 37
但我也不喜欢它的行为方式。在我看来,它应该抛出一个错误,因为您的
FROM
子句没有指定任何要作为
emp\u table
寻址的表。唉,Teradata通常只通过引用新表实例就允许隐式连接到它们

所以我提到,即使查询完成,也会得到意外的结果。考虑一个小数据集的例子:

EMP_TABLE
-----------------------------
EMP_ID     | DEPT_ID  | NAME
1          | A        | Sue
2          | B        | Bob

DEPT_TABLE
------------------------------
DEPT_ID   | NAME
A         | Engineering
B         | Sales
C         | Legal
好的,假设您只想列出员工及其部门的姓名:

select e.name, d.name
  from            emp_table e
       inner join dept_table d
               on d.dept_id = e.dept_id
这很好,但现在你决定将员工排除在销售之外。但是您可以使用实际的表名而不是
d

select e.name, d.name
  from            emp_table e
       inner join dept_table d
               on d.dept_id = e.dept_id
 where dept_table.name <> 'Sales'
一下子
WHERE
过滤器没有按预期应用。对
e
d
中的行,除了它们的联接条件外,没有任何限制,因此Sue和Bob都保留在结果中

更糟糕的是,这个额外的关系
x
返回了两行,这两行与结果集的其余部分交叉连接(这就是为什么每个返回的记录都有重复的原因)。

更新:解决注释中的后续问题 当您使用“真实”表名进行限定时,Teradata不会假定您指的是与别名相同的表实例。因此,它交叉连接了
emp_table
(在您的示例中)的另一个实例,该实例生成的数据一定太多,您的安装无法处理。(即使它运行到完成阶段,也会得到意想不到的结果,因为逻辑根本没有说出你的意思;请参见下文。)

如果您仔细想想,DBMS将走上一条危险的道路,假设
emp_table.dep_no
引用与
E.dep_no
相同的表实例;那么,它将如何处理这一问题:

SELECT e.id
  FROM            emp_table e
       inner join emp_table m
               on e.manager_id = m.id
 WHERE emp_table.dep_num = 37
但我也不喜欢它的行为方式。在我看来,它应该抛出一个错误,因为您的
FROM
子句没有指定任何要作为
emp\u table
寻址的表。唉,Teradata通常只通过引用新表实例就允许隐式连接到它们

所以我提到,即使查询完成,也会得到意外的结果。考虑一个小数据集的例子:

EMP_TABLE
-----------------------------
EMP_ID     | DEPT_ID  | NAME
1          | A        | Sue
2          | B        | Bob

DEPT_TABLE
------------------------------
DEPT_ID   | NAME
A         | Engineering
B         | Sales
C         | Legal
好的,假设您只想列出员工及其部门的姓名:

select e.name, d.name
  from            emp_table e
       inner join dept_table d
               on d.dept_id = e.dept_id
这很好,但现在你决定将员工排除在销售之外。但是您可以使用实际的表名而不是
d

select e.name, d.name
  from            emp_table e
       inner join dept_table d
               on d.dept_id = e.dept_id
 where dept_table.name <> 'Sales'
一下子
WHERE
过滤器没有按预期应用。对
e
d
中的行,除了它们的联接条件外,没有任何限制,因此Sue和Bob都保留在结果中


更糟糕的是,这个额外的关系
x
返回了两行,它们与结果集的其余部分交叉连接(这就是为什么每个返回的记录都有重复的原因)。

解释得很好。我仍然怀疑,即使Teradata假设它是emp_表的另一个实例,它也会包含与emp_表中相同的数据。那么,这是如何产生意想不到的结果的呢?解释得很好。我仍然怀疑,即使Teradata假设它是emp_表的另一个实例,它也会包含与emp_表中相同的数据。那么这是如何产生意想不到的结果的呢?