Module &引用;“线轴外”;Teradata中的错误
为什么在联接条件中用实际表名为表和质量别名时会出现“脱离假脱机”错误 比如,; 来自emp_表E的sel名称、ID 内连接 副表D 在…上 emp_表.dep_no=D.dep_no更新:解决评论中的后续问题 当您使用“真实”表名进行限定时,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_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_表中相同的数据。那么这是如何产生意想不到的结果的呢?