1

请注意这不是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

4 回答 4

3

有两个问题……第一个是 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)

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

于 2013-10-29T21:04:36.070 回答
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;
于 2013-10-29T12:00:30.707 回答
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
    

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

于 2013-10-31T07:29:54.963 回答
-1

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

(SELECT * FROM searchable.keyword) kw1, 
(SELECT keyword From searchable.keyword 
GROUP BY keyword ORDER BY keyword DESC) kw2 
WHERE kw1.keyword CONTAINS(kw2.keyword)
于 2013-10-29T12:05:20.903 回答