Konsep SQL untuk join

Sama seperti di SQL, join di LookML digunakan untuk menggabungkan baris dari dua tabel atau lebih, berdasarkan kolom terkait di antara keduanya.

Di LookML, Eksplorasi — seperti yang ditentukan oleh parameter LookML explore — digunakan untuk menentukan cara pengguna dapat membuat kueri data. Eksplorasi terdiri dari setidaknya satu tabel virtual atau sekumpulan tabel virtual yang digabungkan. Tabel virtual utama dalam Eksplorasi selalu disertakan dalam kueri. Tabel virtual yang digabungkan biasanya hanya disertakan jika diperlukan untuk memenuhi kueri.

Tabel virtual LookML sesuai dengan tabel SQL (atau elemen lain yang memiliki struktur tabel) dalam database, atau ke tabel turunan. Tabel virtual menentukan kolom atau kolom yang tersedia dalam database, dan cara mengaksesnya.

Contoh berikut adalah definisi untuk Eksplorasi orders.

explore: orders {
  join: users {
    type: left_outer
    sql_on: ${orders.user_id} = ${users.id} ;;
    relationship: many_to_one
  }
}

Tabel virtual orders, yang merupakan tabel virtual utama dalam Eksplorasi, digabungkan ke tabel virtual users dengan SQL LEFT OUTER JOIN, seperti yang ditunjukkan oleh parameter LookML type: left_outer. Klausa SQL ON, yang ditentukan oleh parameter LookML sql_on, tidak menggunakan table_alias.column, tetapi merujuk to ${view_name.field_name}. Hal ini agar jika nama tabel atau nama kolom berubah dalam database, perubahan tersebut hanya perlu dilakukan di satu tempat.

Parameter relationship penting. Penggabungan dapat menyebabkan masalah fanout saat baris diduplikasi. Dengan menentukan bahwa banyak pesanan akan digabungkan ke hanya satu pengguna, Looker mengenali bahwa fanout tidak akan terjadi dari penggabungan ini, sehingga penanganan khusus tidak diperlukan. Namun, hubungan one_to_many dapat memicu fanout.

Pembuatan otomatis tabel virtual dan Eksplorasi secara default menggunakan left outer join. Namun, pada contoh sebelumnya, kemungkinan besar setiap pesanan akan memiliki tepat satu pengguna, sehingga penggabungan dalam contoh ini dapat berupa inner join.

Untuk melihat SQL yang dihasilkan dari Eksplorasi, Anda dapat menjalankan Eksplorasi di UI, lalu memilih tab SQL di panel Data.

Misalnya, jika Anda membuka Eksplorasi Orders, yang ditentukan sebelumnya, lalu memilih kolom User ID dan Count, SQL yang dihasilkan akan terlihat seperti berikut:

SELECT
    `user_id` AS `orders.user_id`,
    COUNT(*) AS `orders.count`
FROM
    `thelook`.`orders` AS `orders`
GROUP BY
    1
ORDER BY
    2 DESC
LIMIT 500

Dalam contoh ini, tabel pengguna tidak dirujuk sama sekali. Tabel ini hanya disertakan jika diperlukan.

Jika Anda menghapus dimensi User ID dan menambahkan dimensi ID dari tabel virtual Users, SQL akan terlihat seperti berikut:

SELECT
    `users`.`id` AS `users.id`,
    COUNT(*) AS `orders.count`
FROM
    `thelook`.`orders` AS `orders`
    INNER JOIN `thelook`.`users` AS `users` ON `orders`.`user_id` = `users`.`id`
GROUP BY
    1
ORDER BY
    2 DESC
LIMIT 500

Dalam hal ini, karena ada pilihan dari tabel virtual Users, penggabungan akan disertakan.

Contoh berikut menunjukkan LookML dalam file Eksplorasi orders, yang ditentukan sebelumnya, dan menambahkan penggabungan ke tabel virtual order_items:

explore: orders {
  join: users {
    type: inner
    sql_on: ${orders.user_id} = ${users.id} ;;
    relationship: many_to_one
  }
  join: order_items {
    type: inner
    sql_on: ${orders.id} = ${order_items.order_id} ;;
    relationship: one_to_many
  }
}

Sekarang, jika Anda membuka Eksplorasi Orders di UI, Anda akan melihat tabel virtual Order Items. Jika Anda memilih ukuran Total Sale Price dari tabel virtual Order Items bersama dengan Count dari Orders dan ID dari Users, Looker akan menghasilkan SQL berikut:

SELECT
    `users`.`id` AS `users.id`,
    COUNT(DISTINCT orders.id ) AS `orders.count`,
    COALESCE(SUM(`order_items`.`sale_price`), 0) AS `order_items.total_sale_price`
FROM
    `thelook`.`orders` AS `orders`
    INNER JOIN `thelook`.`users` AS `users` ON `orders`.`user_id` = `users`.`id`
    INNER JOIN `thelook`.`order_items` AS `order_items` ON `orders`.`id` = `order_items`.`order_id`
GROUP BY
    1
ORDER BY
    2 DESC
LIMIT 500

Dalam contoh ini, COUNT(*) AS orders.count menjadi COUNT(DISTINCT orders.id ) AS orders.count. Looker mendeteksi bahwa ada kemungkinan situasi fanout dan otomatis menambahkan kata kunci SQL DISTINCT ke fungsi SQL COUNT.