如何在没有Join的BigQuery中选择同一个表中的匹配项

时间:2013-10-29 11:54:22

标签: sql google-bigquery

请注意,这不是 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不允许您在连接条件中添加任何内容,除了Table1.field = Table2.field

4 个答案:

答案 0 :(得分:3)

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

(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)

当然,这个交叉连接将会爆炸成一个相当大的桌子。

答案 1 :(得分:0)

试试这个 -

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;

答案 2 :(得分:0)

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

  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
    
  3. 性能不会很好,但它会起作用。

答案 3 :(得分:-1)

我不确定这适用于google big-query,但您可以尝试使用此语法

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