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 を超えるエントリがあることです。結合条件は親 ID であり、450K には親 ID が同じであり、BigQuery では、Table1.field = Table2.field 以外を結合条件に追加することはできません

4

4 に答える 4

3

2 つの問題があります... 1 つ目は、bigquery が等結合のみをサポートしていることです。つまり、完全に等しい場合にのみ結合できます。2 つ目は、カンマが 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)

もちろん、このクロス結合は、かなり大きなサイズのテーブルでは爆発します。

于 2013-10-29T21:04:36.070 に答える
0

私がこれに取り組む2つの方法:

  1. Lag 関数と Lead 関数を使用します。このようにして、単一のテーブルで実行し、同じ値を持つ次のレコードを抽出できます (= に対してのみ機能するか、文字列の先頭に含まれます)。

  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 に答える