请注意,这不是 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
答案 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)
我将解决这个问题的两种方法:
使用滞后和超前功能。通过这种方式,您可以在单个表上运行,并提取具有相同值的以下记录(它仅适用于=,或包含在字符串的开头。)
使用虚拟连接条件创建完整的交叉连接,然后将条件放在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 :(得分:-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)