【问题标题】:How to select matches in the same table in BigQuery without Join如何在没有加入的情况下在 BigQuery 的同一个表中选择匹配项
【发布时间】: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 表非常适合尝试替代方案。

标签: sql google-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】:

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

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

  2. 使用虚构连接条件创建完全交叉连接,然后将您的条件放在 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2018-04-11
      • 2015-04-19
      • 2023-01-31
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多