【问题标题】:(Teradata Version)- get all records plus all corresponding records in another table(Teradata 版本)- 获取所有记录以及另一个表中的所有对应记录
【发布时间】:2017-09-06 03:09:55
【问题描述】:

可以针对 Teradata 优化以下查询吗?

我们需要小表 A 中的所有记录,以及大表 B 中的所有对应记录,它们与非唯一键匹配

或者,换句话说:除了所有来自 B 且在 A 中不匹配的所有内容。

也许有 JOIN 的东西?或者是非相关查询的子选择,这也适用于 Teradata 吗?

SELECT a.nonunique
       , a.colX
  FROM small_tab a
 UNION ALL
SELECT b.nonunique
       , b.colY
  FROM large_tab b
 WHERE EXISTS (
                SELECT 1
                  FROM small_tab a
                 WHERE a.nonuniqe = b.nonunique
              );

感谢您的帮助!

=========更新====
根据this MySQL question 中的 quanos 答案,在 Teradata 中,带有非相关子查询的以下语句是否也会更快?

SELECT a.nonunique
       , a.colX
  FROM small_tab a
 UNION ALL
SELECT b.nonunique
       , b.colY
  FROM large_tab b
 WHERE b.nonunique IN
 (
    SELECT DISTINCT nonunique
      FROM small_tab
  GROUP BY nonunique
) 

我目前无法在 Teradata 中进行测试,家里只有一个 Oracle 实例..

【问题讨论】:

  • 你真的需要UNION吗?不同的处理是一个巨大的开销,UNION ALL 会更快。
  • 谢谢,我监督了。它来自我第一次使用的另一个选择,我认为它的效率较低(涉及返回重复项的连接)。更新了..

标签: sql optimization teradata exists


【解决方案1】:

我不确定这是否是拼写错误,但您在 WHERE 子句之后有一个冗余的选择查询。此外,您必须在 WHERE Claue 中使用的 SELECT 查询中使用相同的列名。 下面的查询在 Teradata 中运行良好。

SELECT a.nonunique, a.colX
FROM small_tab a
UNION ALL
SELECT b.nonunique, b.colY
FROM large_tab b
WHERE b.id IN(
    SELECT **id**
    FROM small_tab)

希望对您有所帮助。如果对上述查询有任何疑问,请告诉我。

【讨论】:

  • 嗨。不是拼写错误,而是故意的 - 额外的子选择强制内部选择是不相关的子查询,请参阅提到的链接。这在 MySQL 中有效,我想知道它在 Teradata 中是否也更高效..
  • 实际上我又犯了一个错字,我不想在 id 上匹配,但在 nonunique.. 因此我添加了 DISTINCT
  • 确定另一条评论 - 我现在怀疑我们是否真的需要该帖子中提到的这个额外的子选择......我明白你的意思,这对我来说似乎有点没用......?也许这只是一个 MySQL 缺陷。删除它..
  • 根据您提到的要求,我认为没有必要..但是如果这没有按要求提供输出,那么您能否更新要求。
猜你喜欢
  • 2012-03-08
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 2021-07-08
  • 2010-12-31
相关资源
最近更新 更多