Penggunaan
explore: view_name_1 {
join: view_name_2 {
sql_on: ${view_name_1.id} = ${view_name_2.id} ;;
}
}
|
Hierarki
sql_on |
Nilai Default
Tidak ada
Menerima
Klausul ON SQL
Aturan Khusus
sql_on, sql_foreign_key, dan foreign_key tidak boleh digunakan secara bersamaan dalam join yang sama
|
Definisi
sql_on menetapkan hubungan gabungan antara tampilan dan Eksplorasinya, berdasarkan klausul ON SQL yang Anda berikan.
Untuk LookML, urutan kondisi dalam sql_on tidak penting. Jadi, sql_on: ${order.user_id} = ${user.id} ;; dan sql_on: ${user.id} = ${order.user_id} ;; setara. Anda dapat menempatkan kondisi dalam urutan apa pun, kecuali jika urutan tersebut relevan dengan dialek SQL database Anda.
Tampilan dapat digabungkan langsung ke Eksplorasi saat menggunakan sql_on, atau dapat digabungkan melalui tampilan kedua yang sudah digabungkan ke Eksplorasi tersebut.
Contoh kasus pertama, saat tampilan digabungkan langsung ke Eksplorasi, terlihat seperti ini:
explore: order {
join: customer {
sql_on: ${order.customer_id} = ${customer.id} ;;
}
}
SQL yang akan dihasilkan Looker dari LookML ini adalah:
SELECT ...
FROM order
LEFT JOIN customer
ON order.customer_id = customer.id
Dalam kasus kedua, tampilan digabungkan ke Eksplorasi melalui tampilan perantara yang sudah digabungkan ke Eksplorasi tersebut. Contohnya adalah:
explore: order_items {
join: order {
sql_on: ${order_items.order_id} = ${order.id} ;;
}
join: customer {
sql_on: ${order.customer_id} = ${customer.id} ;;
}
}
Di sini, customer tidak dapat digabungkan langsung ke order_items. Sebagai gantinya, kolom ini harus digabungkan melalui order. SQL yang akan dihasilkan Looker dari LookML ini adalah:
SELECT ...
FROM order_items
LEFT JOIN order
ON order_items.order_id = order.id
LEFT JOIN customer
ON order.customer_id = customer.id
Agar fungsi ini berfungsi dengan benar, Anda dapat melihat bahwa kita hanya perlu menggunakan nama tampilan yang benar dalam referensi kolom. Karena customer harus digabungkan ke kolom di order, kita mereferensikan ${order.customer_id}.
Di beberapa model lama, Anda mungkin melihat kolom yang direferensikan dengan sintaksis
view_name.native_column_name. Meskipun masih berfungsi, menggunakan sintaksis${view_name.looker_dimension_name}memiliki keunggulan penting: Anda dapat menghindari kebutuhan parameterrequired_joins. Konsep ini dijelaskan lebih mendetail di bagian Menggunakanrequired_joinssaat sintaksis${view_name.looker_dimension_name}tidak dapat digunakan di halaman ini.
Gabungan bersyarat
Anda juga dapat mengizinkan input pengguna digunakan di sql_on. Meskipun ada berbagai alasan mengapa Anda mungkin ingin melakukannya, mengoptimalkan kecepatan kueri di database MPP (seperti Redshift) adalah kasus penggunaan utama, seperti yang dijelaskan dalam postingan Komunitas Kondisi dalam Klausul Gabungan.
Untuk menambahkan input pengguna ke kondisi gabungan, Anda harus membuat filter untuk inputnya terlebih dahulu. Jenis filter ini dijelaskan lebih mendetail di halaman Filter Bertemplate. Bentuk dasarnya adalah:
view: view_name {
filter: filter_name {
type: number | datetime | date | string
}
}
Setelah menambahkan filter untuk mengumpulkan input pengguna, Anda menggunakannya dalam parameter sql_on seperti ini:
{% condition view_name.filter_name %} view_name.dimension_name {% endcondition %}
Contoh:
explore: order {
join: customer {
sql_on:
${order.customer_id} = ${customer.id} AND
{% condition customer.creation_date_filter %} customer.created_at {% endcondition %} ;;
}
}
Hal ini akan ditafsirkan sebagai: menetapkan customer.created_at sama dengan nilai dari customer.creation_date_filter.
Menggunakan variabel Liquid _in_query, _is_selected, dan _is_filtered
Variabel Liquid _in_query, _is_selected, dan _is_filtered dapat berguna saat digunakan dengan parameter sql_on. Variabel ini dapat memungkinkan Anda mengubah hubungan gabungan berdasarkan kolom yang telah dipilih pengguna untuk kuerinya. Contoh:
explore: dates {
join: dynamic_order_counts {
sql_on:
${dynamic_order_counts.period} =
{% if dates.reporting_date._in_query %}
${dates.date_string}
{% elsif dates.reporting_week._in_query %}
${dates.week_string}
{% else %}
${dates.month_string}
{% endif %} ;;
}
}
Contoh
Gabungkan tampilan bernama customer ke Eksplorasi bernama order dengan mencocokkan dimensi customer_id dari order dengan dimensi id dari customer:
explore: order {
join: customer {
sql_on: ${order.customer_id} = ${customer.id} ;;
}
}
Gabungkan tampilan bernama customer ke Eksplorasi bernama order_items melalui tampilan bernama order. Cocokkan dimensi customer_id dari order dengan dimensi id dari customer. Cocokkan dimensi order_id dari order_items dengan dimensi id dari order. Hal ini akan ditentukan sebagai berikut:
explore: order_items {
join: order {
sql_on: ${order_items.order_id} = ${order.id} ;;
}
join: customer {
sql_on: ${order.customer_id} = ${customer.id} ;;
}
}
Gabungkan tampilan bernama order dan inventory_items ke Eksplorasi bernama order_items. Cocokkan dimensi inventory_id dari order_items dengan dimensi id dari inventory_item. Cocokkan dimensi order_id dari order_items dengan dimensi id dari order. Hal ini akan ditentukan sebagai berikut:
explore: order_items {
join: order {
sql_on: ${order_items.order_id} = ${order.id} ;;
}
join: inventory_item {
sql_on: ${order_items.inventory_id} = ${inventory_item.id} ;;
}
}
Yang perlu diketahui
Menggunakan required_joins saat sintaksis ${view_name.looker_dimension_name} tidak dapat digunakan
Saat mereferensikan kolom di sql_on menggunakan sintaksis ${view_name.looker_dimension_name}, Anda tidak perlu khawatir menggunakan required_joins.
Namun, beberapa model lama masih menggunakan sintaksis view_name.native_column_name. Ada juga beberapa kasus saat Anda tidak dapat menggunakan sintaksis ${view_name.looker_dimension_name}, seperti saat Anda ingin menerapkan SQL kustom.
Dalam situasi ini, Anda mungkin perlu menggunakan required_joins. Hal ini dibahas lebih mendetail di halaman dokumentasi parameter required_joins.