作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要使用 OR 条件将一个巨大的表(超过 1000 万行)连接到一个查找表(超过 15000 行)。像这样的东西:
SELECT t1.a, t1.b, nvl(t1.c, t2.c), nvl(t1.d, t2.d)
FROM table1 t1
JOIN table2 t2 ON t1.c = t2.c OR t1.d = t2.d;
这是因为 table1 可以将 c
或 d
作为 NULL
,我想加入任何一个可用的,省略其余的部分。查询计划说有一个嵌套循环,我意识到这是因为 OR
条件。有没有一种干净、有效的方法来解决这个问题?我正在使用 Redshift。
编辑:我正在尝试使用 UNION
运行它,但它似乎并没有比以前更快。
最佳答案
如果您有首选专栏,您可以NVL()
(又名COALESCE()
)并加入其中。
SELECT t1.a, t1.b, nvl(t1.c, t2.c), nvl(t1.d, t2.d)
FROM table1 t1
JOIN table2 t2
ON t1.c = NVL(t2.c,t2.d);
我还建议您将查找表设置为 DISTSTYLE ALL
以确保不会重新分配较大的表。
[ 此外,1000 万行对于 Redshift 来说并不大。并不是说我们在 Redshift 上获得了出色的性能,即使是在查询(和连接)具有数千亿行的表时,也不要自以为是。 ]
关于join - Redshift - 带 OR 的高效 JOIN 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41092500/
我是一名优秀的程序员,十分优秀!