如何在没有加入的情况下在 BigQuery 的同一个表中选择匹配项

Posted

技术标签:

【中文标题】如何在没有加入的情况下在 BigQuery 的同一个表中选择匹配项【英文标题】:How to select matches in the same table in BigQuery without Join 【发布时间】:2013-10-29 11:54:22 【问题描述】:

请注意这不是 MySQL 我说的是 BigQuery

我需要在 Google Big-Query 上执行以下操作

SELECT * FROM searchable.keyword AS kw1, 
(SELECT keyword From searchable.keyword 
    GROUP BY keyword ORDER BY keyword DESC) AS kw2 
WHERE kw1.keyword CONTAINS(kw2.keyword)
# or  even kw1.keyword = kw2.keyword <-- I don't need this now but it doesn't work as well

kw2 是未知的,kw1 也是错误的

注意:我可以用 JOIN 然后过滤来执行这个查询,但是问题是表有超过 450K 的条目,这样的连接会导致巨大的 450K 平方,因为连接条件是父 ID,而450K有相同的父ID,BigQuery不允许你在join条件中添加任何东西,除了Table1.field = Table2.field

【问题讨论】:

您能留下一些示例数据来解释您要做什么吗?包含示例数据的公共 BigQuery 表非常适合尝试替代方案。 【参考方案1】:

有两个问题...第一个是 bigquery 只支持 equi-join —— 也就是说,您只能在完全相等的情况下加入。第二个是逗号是 UNION ALL 而不是 JOIN (这是不幸的遗留行为) 为此,您需要计算完整的交叉连接:

(SELECT keyword, 1 as cross FROM searchable.keyword) AS kw1 
JOIN EACH
    (SELECT keyword, 1 as cross FROM searchable.keyword GROUP BY keyword) 
ON kw1.cross = kw2.cross
WHERE kw1.keyword CONTAINS(kw2.keyword)

当然,对于一个相当大的表,这个交叉连接会爆炸。

【讨论】:

我已经这样做了,但我会将答案标记为真的,因为它实际上是正确的。【参考方案2】:

试试这个 -

SELECT * FROM searchable.keyword AS kw1, 
(SELECT keyword From searchable.keyword 
    GROUP BY keyword ORDER BY keyword DESC) AS kw2 
WHERE INSTR(kw1.keyword, kw2.keyword,1,1) <>0;

【讨论】:

问题不在“CONTAINS”或“INSTR”阅读上面的错误。【参考方案3】:

解决这个问题的两种方法:

    使用滞后和超前功能。这样,您可以在单个表上运行,并提取具有相同值的以下记录(它仅适用于 =,或包含在字符串的开头。)

    使用虚构连接条件创建完全交叉连接,然后将您的条件放在 WHERE 子句中。像这样的:

    SELECT * FROM
    (SELECT *, 1 as one from table) A
    JOIN
    (SELECT *, 1 as one from table) B
    ON A.One=B.One
    WHERE INSTR(A.keyword, B.keyword,1,1) <>0
    

性能不会很好,但会起作用。

【讨论】:

【参考方案4】:

我不确定这是否适用于谷歌大查询,但您可以尝试这种语法

(SELECT * FROM searchable.keyword) kw1, 
(SELECT keyword From searchable.keyword 
GROUP BY keyword ORDER BY keyword DESC) kw2 
WHERE kw1.keyword CONTAINS(kw2.keyword)

【讨论】:

以上是关于如何在没有加入的情况下在 BigQuery 的同一个表中选择匹配项的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有时区干扰的情况下在树枝中渲染时间

如何在不创建另一个新标签或新浏览器窗口的情况下在同一网页中播放 MPG 视频/音频文件?

如何在不重新加载的情况下在同一页面上提交文件[重复]

如何在不使用 join 或 cte 的情况下在同一查询中使用动态生成的列

如何在不使用集合运算符的情况下在 oracle 中查找不匹配的行并加入 & 还查询特定行的不匹配列名

如何在不更改构建系统的情况下在 C 项目中使用 rust 代码?