メインコンテンツへスキップ
merge テーブル関数を使用すると、複数のテーブルを並列にクエリできます。 これは、一時的な Merge テーブルを作成し、各テーブルのカラムのユニオンを取り、共通の型を導出することで、そのテーブルの構造を決定します。

テーブルをセットアップする

Jeff Sackmann’s tennis dataset を使って、この関数の使い方を見ていきます。 1960年代までさかのぼる試合を含む CSVファイルを処理しますが、年代ごとに少し異なるスキーマを作成します。 また、1990年代のデータには追加のカラムもいくつか加えます。 インポート用のステートメントを以下に示します。

複数テーブルのスキーマ

次のクエリを実行すると、各テーブルのカラムとその型を横に並べて一覧表示できるため、違いを確認しやすくなります。
違いを見ていきましょう。
  • 1970s では、winner_seed の型が Nullable(String) から Nullable(UInt8) に、score の型が String から Array(String) に変わります。
  • 1980s では、winner_seedloser_seed の型が Nullable(UInt8) から Nullable(UInt16) に変わります。
  • 1990s では、surface の型が String から Enum('Hard', 'Grass', 'Clay', 'Carpet') に変わり、walkoverretirement のカラムが追加されます。

merge を使った複数テーブルのクエリ

John McEnroe が第1シードの相手に勝利した試合を見つけるクエリを書いてみましょう:
次に、それらの試合のうち、McEnroe が第3シード以下だったものに絞り込むとします。 ただし、winner_seed はテーブルごとに使われているデータ型が異なるため、これは少し厄介です。
variantType 関数を使用して各行の winner_seed の型を確認し、続いて variantElement で実際の値を取り出します。 型が String の場合は数値にキャストしてから比較します。 クエリの実行結果を以下に示します。

merge を使用する場合、行はどのテーブルから来ているのでしょうか?

行がどのテーブルに由来するのかを知りたい場合はどうすればよいでしょうか。 これには、次のクエリに示すように _table 仮想カラムを使用できます。
この仮想カラムは、walkoverカラムの値を数えるクエリの一部として使うこともできます:
walkover カラムは、atp_matches_1990s を除くすべてで NULL になっていることがわかります。 そのため、walkover カラムが NULL の場合は、score カラムに文字列 W/O が含まれているかどうかを確認するようにクエリを更新する必要があります:
score の基底型が Array(String) の場合は、配列内を走査して W/O を探す必要があります。一方、型が String の場合は、文字列内で W/O を検索するだけで済みます。
最終更新日 2026年7月3日