LoginSignup
9
5

More than 5 years have passed since last update.

【BigQuery】EXISTS関数をつかって、目的の行を抜き出してみた

Last updated at Posted at 2019-03-26

概要

BigQueryでEXISTS関数を紹介します。

以下、Postgresqlドキュメントより引用

EXISTSの引数は、任意のSELECT文、つまり副問い合わせです。 副問い合わせはそれが何らかの行を返すか否かの決定のために評価されます。 もし1つでも行を返すのであれば、EXISTSの結果は「true(真)」となり、副問い合わせが行を返さない場合、EXISTSの結果は「false(偽)」となります。

データ紹介

テーブル1:item_table

user_id item price
A みかん 50
A もやし 19
A りんご 100
B りんご 100
B りんご 90

テーブル2:item_price_m

product price
もやし 19
ネギ 298
小松菜 298
みかん 50
りんご 100
メロン 3000

基本1:EXISTS関数の使い方

BigQueryへ取り込んでおいた二つのテーブルを使い、WHERE句で条件を絞ります。

BigQuery 基本1

SELECT
  *
FROM
  test1.item_table AS t1
WHERE
  EXISTS (
  SELECT
    product
  FROM
    test1.item_price_m AS t2
  WHERE
    t1.item = t2.product )
ORDER BY
  user_id ;

出力は以下です。
image.png

続いて、複数の条件をいれた場合です。

BigQuery 基本1 複数の条件の場合

SELECT
  *
FROM
  test1.item_table AS t1
WHERE
  EXISTS (
  SELECT
    product
  FROM
    test1.item_price_m AS t2
  WHERE
    t1.item = t2.product
    AND t1.price = t2.price)
ORDER BY
  user_id ;

出力は以下のようになります。
image.png

基本2:NOT EXISTS関数の使い方

EXISTS関数と対の条件になるNOT EXISTSを使ってみます。

NOT EXISTSを使った構文は以下になります。

BigQuery 基本2


SELECT
  *
FROM
  test1.item_table AS A
WHERE
  NOT EXISTS (
  SELECT
    item
  FROM
    test1.item_price_m AS B
  WHERE
    A.item = B.product
    AND A.price = B.price )
ORDER BY
   user_id;

出力は以下の様になりました。

image.png

条件に一致しない行の抽出がされました。

まとめ

EXISTS関数を使うと、テーブルに目的の行が存在するかどうかの存在チェックができます。
WHERE句のINと似ていますが、SQLの実行挙動が異なり、EXSITS関数の方が、早いと言われています。
是非、習得しておきたい関数だとおもいました。

参考サイト

https://cloud.google.com/bigquery/docs/reference/standard-sql/migrating-from-legacy-sql?hl=ja
https://www.postgresql.jp/document/10/html/functions-subquery.html

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5