בדומה ל-SQL, שאילתת join ב-LookML משמשת לשילוב שורות משתי טבלאות או יותר, על סמך עמודה קשורה ביניהן.
ב-LookML, Explore – כפי שמוגדר על ידי פרמטר LookML explore – משמש להגדרת האופן שבו משתמש יכול לשלוח שאילתות לנתונים. ניתוח ב-Explore מורכב מתצוגה אחת לפחות או מקבוצה של תצוגות שמחוברות יחד. התצוגה הראשית בדוח הניתוח תמיד נכללת בשאילתה. בדרך כלל, התצוגות המאוחדות נכללות רק אם הן נדרשות כדי לענות על השאילתה.
תצוגת LookML תואמת לטבלת SQL (או לרכיב אחר שיש לו מבנה של טבלה) במסד הנתונים, או לטבלה נגזרת. התצוגה מגדירה אילו שדות או עמודות זמינים במסד הנתונים, ואיך אפשר לגשת אליהם.
הדוגמה הבאה היא הגדרה של orders Explore.
explore: orders {
join: users {
type: left_outer
sql_on: ${orders.user_id} = ${users.id} ;;
relationship: many_to_one
}
}
התצוגה orders, שהיא התצוגה הראשית ב-Explore, מצורפת לתצוגה users באמצעות SQL LEFT OUTER JOIN, כפי שמצוין בפרמטר type: left_outer LookML. התנאי SQL ON, שמוגדר על ידי הפרמטר sql_on LookML, לא משתמש ב-table_alias.column אלא מתייחס ל-to ${view_name.field_name}. כך, אם שם הטבלה או שם העמודה משתנים במסד הנתונים, צריך לבצע את השינוי רק במקום אחד.
הפרמטר relationship חשוב. הצטרפות יכולה לגרום לבעיות של פיצול, שבהן השורות משוכפלות. כשמציינים שהרבה הזמנות ישויכו רק למשתמש אחד, Looker מזהה שלא יתרחשו פיצולים מהצירוף הזה, ולכן לא נדרש טיפול מיוחד. עם זאת, קשרים מסוג one_to_many יכולים להפעיל פיצול.
ברירת המחדל של יצירה אוטומטית של תצוגות וניתוחים היא צירוף חיצוני שמאלי. עם זאת, בדוגמה הקודמת, סביר מאוד שלכל הזמנה יהיה בדיוק משתמש אחד, ולכן אפשר להשתמש ב-inner join בדוגמה הזו.
כדי לראות את ה-SQL שנוצר של Explore, אפשר להריץ את ה-Explore בממשק המשתמש ואז לבחור בכרטיסייה SQL בחלונית Data.
לדוגמה, אם פותחים את הניתוח Orders שהוגדר קודם, ואז בוחרים בשדות User ID ו-Count, ה-SQL שייווצר ייראה כך:
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
בדוגמה הזו, אין הפניה לטבלת המשתמשים. הוא מופעל רק אם יש צורך.
אם מסירים את המאפיין User ID ומוסיפים את המאפיין ID מהתצוגה Users, ה-SQL ייראה כך:
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
במקרה הזה, מכיוון שיש בחירה בתצוגה Users (משתמשים), הצירוף נכלל.
בדוגמה הבאה מוצג קוד LookML בקובץ orders Explore שהוגדר קודם, ומוסף אליו צירוף לתצוגה 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
}
}
עכשיו, אם פותחים את התצוגה המקדימה של הזמנות בממשק המשתמש, רואים את התצוגה פריטי הזמנה. אם בוחרים את המדד מחיר המכירה הכולל מהתצוגה פריטי הזמנה יחד עם המדד ספירה מהתצוגה הזמנות והמדד מזהה מהתצוגה משתמשים, Looker יוצר את ה-SQL הבא:
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
בדוגמה הזו, הערך COUNT(*) AS orders.count הפך לערך COUNT(DISTINCT orders.id ) AS orders.count. מערכת Looker זיהתה מצב אפשרי של פיצול נתונים והוסיפה באופן אוטומטי את מילת המפתח SQL DISTINCT לפונקציה SQL COUNT.