นอร์มัลฟอร์ม


Home Page  |   รายการบทความ   |   ลิงค์ที่เกี่ยวข้อง   |   laploy.com  |  เกี่ยวกับผู้เขียน

นอร์มัลฟอร์ม

 

นอร์มัลไลเซชันคือการออกแบบฐานข้อมูลให้อยู่ในสภาพ "นอร์มัลฟอร์ม" (normal form ย่อ NF) ระดับต่างๆ เช่น ระดับที่ 1 (1NF) ระดับที่ 2 (2NF) คำว่านอร์มัลฟอร์มเป็นคำที่ถูกบัญญัติโดยคอดด์ นอกจากจะบัญญัติคำว่านอร์มัลฟอร์มแล้ว คอดด์ยังเป็นผู้นิยามนอร์มัลไลเซชันสามระดับแรกด้วย (คือ 1NF, 2NF และ 3NF) การออกแบบฐานข้อมูลไม่จำเป็นต้องทำ NF ให้ครบทุกระดับเสมอไปเพราะการทำ NF หลายๆ ระดับกับฐานข้อมูล OLAP อาจทำให้ประสิทธิภาพโดยรวมลดลง

นิยาม อะนอมาลิ

อะนอมาลิ (Anomaly ความวิปริต)เป็นสิ่งที่ไม่มีใครชอบและท่าน (ในฐานะที่เป็นนักออกแบบฐานข้อมูล) จะต้องหาทางขจัดมันออกไป ในการออกแบบฐานข้อมูล NF คือรูปแบบที่พึงประสงค์ส่วนอะนอมาลิคือรูปแบบที่ไม่พึงประสงค์ จุดมุ่งหมายของการออกแบบฐานข้อมูลคือการกำจัดอะนอมาลิ อะนอมาลิเป็นสิ่งไม่ดีเพราะมันคือตัวการที่ทำให้ข้อมูลขัดแย้งกันในทางตรรกะ

อะนอมาลิทำให้เกิดความผิดพลาดเมื่อเพิ่มลบหรือเปลี่ยนแปลงข้อมูลในลักษณะต่างๆ ดังนี้

  • อะนอมาลิของการแทรกข้อมูล: ความผิดปรกติเช่นนี้เกิดเมื่อแทรกข้อมูลใน CT โดยไม่ได้แทรกข้อมูลใน PT ก่อน ยกตัวอย่างเช่นในภาพ 6-1 จะเห็นว่า Author เป็น PT ทำหน้าที่เก็บรายชื่อนักเขียน Book คือ CT ทำหน้าที่เก็บรายละเอียดของหนังสือ การแทรกข้อมูลใหม่ตามปรกติต้องแทรกข้อมูลนักเขียนเข้าไปใน PT ก่อน แล้วค่อยแทรกข้อมูลหนังสือ (ที่นักเขียนผู้นั้นเขียน) เข้าสู่ CT หากผู้เขียนแทรกข้อมูลหนังสือก่อนที่จะแทรกข้อมูลนักเขียนจะถือเป็นอะนอมาลิของการแทรกข้อมูล

อะนอมาลิของการแทรกข้อมูล

  • อะนอมาลิของการลบข้อมูล: ความผิดปรกติเช่นนี้เกิดเมื่อผู้เขียนลบข้อมูลใน PT โดยไม่ได้ลบข้อมูลทั้งหมด (ที่สัมพันธ์กัน) ใน CT เสียด้วย ยกตัวอย่างเช่นในภาพ 6-2 จะเห็นว่า Author เป็น PT ทำหน้าที่เก็บรายชื่อนักเขียน Book เป็น CT ทำหน้าที่เก็บรายละเอียดของหนังสือ การลบข้อมูลนักเขียนหนึ่งคนตามปรกติต้องลบข้อมูลหนังสือของนักเขียนผู้นั้นทั้งหมดออกจาก CT ก่อน แล้วค่อยลบข้อมูลนักเขียนจาก PT หากผู้เขียนลบข้อมูลนักเขียนใน PT ก่อน ผู้เขียนจะขาดตัวเชื่อมโยงเพื่อลบข้อมูลหนังสือออกจาก CT (คือแถวข้อมูลใน CTกลายเป็นกำพร้า) ซึ่งถือว่าเป็นอะนอมาลิของการลบข้อมูล

 

อะนอมาลิของการลบข้อมูล

  • อะนอมาลิของการอัพเดตข้อมูล: เป็นความผิดปรกติลักษณะเดียวกับความผิดปรกติของการลบข้อมูล เมื่อมีการอัพเดตข้อมูล ข้อมูลต้องถูกอัพเดตทั้งที่ PT และ CT เพื่อป้องกันไม่ให้เกิดแถวข้อมูลกำพร้าใน CT
 
นิยามคำสำคัญในการทำนอร์มัลไลซ์

ต่อไปนี้เป็นนิยามของคำสำคัญต่างๆ ซึ่งเป็นคำจาร์กอนในวิชาออกแบบฐานข้อมูล ท่านจำเป็นต้องเข้าใจความหมายของคำเหล่านี้จึงจะเรียนเรื่องการออกแบบฐานข้อมูลและนอร์มัลไลเซชันในหัวข้อต่อๆ ไปได้เข้าใจ คำเหล่านี้ไม่ใช่คำแปลกใหม่ แต่เป็นคำที่ท่านเคยเรียนมาแล้วในวิชาคณิตศาสตร์ระดับมัธยม (เรื่องพีชคณิตและแคลคูลัส) ทั้งนั้น

การพาดพิง

การพาดพิง (Functional Dependency ย่อ FD) Y เป็น FD ของ X เมื่อค่าของ Y ขึ้นกับค่าของ X ยกตัวอย่างเช่น หาก Y = X + 1 ค่าของ X ย่อมส่งผลต่อค่าของ Y ดังนั้น Y จึงเป็น FD ของ X ยกตัวอย่างเช่นตารางในภาพ 6-3 เป็นตารางเก็บข้อมูลสกุลเงิน คอลัมน์ FXCODE เก็บรหัสย่อของสกุลเงิน คอลัมน์ CURRENCY เก็บชื่อสกุลเงิน คอลัมน์ RATE เก็บอัตราแลกเปลี่ยน และคอลัมน์ COUNTRY เก็บชื่อประเทศ ในตารางนี้ข้อมูลในคอลัมน์ CURRENCY เป็น FD ของข้อมูลในคอลัมน์ FXCODE

ตัวกำหนด

ตัวกำหนด (Determinant) X เป็นตัวกำหนดของ Y เมื่อค่าของ Y ขึ้นกับค่าของ X ยกตัวอย่างเช่นตารางในภาพ 6-3 ข้อมูลในคอลัมน์ FXCODE เป็นตัวกำหนดของข้อมูลในคอลัมน์ CURRENCY

การพาดพิงทางอ้อม

การพาดพิงทางอ้อม (Transitive Dependence ย่อ TD) Z เป็น TD ของ X เมื่อค่าของ X กำหนดค่าของ Y และค่าของ Y กำหนดค่าของ Z ดังนั้นค่าของ Z จึงขึ้นกับค่าของ X โดยอ้อมผ่านความสัมพันธ์ของ Y ยกตัวอย่างเช่นตารางในภาพ 6-3 จะเห็นว่า ค่าของคอลัมน์ RATE ขึ้นกับค่าของคอลัมน์ CURRENCY ซึ่งค่าของคอลัมน์ CURRENCYขึ้นกับค่าของคอลัมน์ COUNTRY อีกต่อหนึ่ง ดังนั้นคอลัมน์ RATE จึงเป็น TD ของคอลัมน์ COUNTRY

 

การพาดพิง ตัวกำหนด และการพาดพิงทางอ้อม

 

กุญแจเสนอ

กุญแจเสนอ (Candidate Key ย่อ CK) คือคอลัมน์ที่อาจนำมาใช้ทำ PK ได้ ในภาพ 6-4 ทางซ้ายสุดคือตารางชื่อ Customer กรอบห้ากรอบทางขวาแสดงคอลัมน์ต่างๆ ที่มีภาวะเป็น CK คือเป็นคอลัมน์ที่อาจนำมาใช้เป็น PK ได้ โปรดสังเกตว่ามีสองตารางที่มี CK มากกว่าหนึ่งคอลัมน์ร่วมกันเป็น PK แม้ CK บางแบบในภาพนี้อาจสุดโต่งไปสักหน่อยแต่ก็ใช้อธิบายแนวคิดของ CK ได้ดี

ตารางและกุญแจเสนอที่อาจนำมาใช้ได้ห้าแบบ

 

การพาดพิงสมบูรณ์

การพาดพิงสมบูรณ์ (Full Functional Dependence ย่อ FFD) X เป็น FFD ของ Y เมื่อค่าของ X กำหนดค่าของ Y แต่ค่าของ X เมื่อร่วมกับค่าของ Z ไม่ได้กำหนดค่าของ Y กล่าวอีกอย่างคือค่าของ Y ขึ้นกับค่าของ X เท่านั้น ยกตัวอย่างเช่นตารางในภาพ 6-5 ซึ่งเหมือนตารางในภาพ 6-4 แต่เพิ่มคอลัมน์ Population ขึ้นอีกหนึ่งคอลัมน์ โปรแกรมสังเกตว่า Population ขึ้นกับค่าของ COUNTRY แต่ไม่ขึ้นกับ COUNTRY + RATE ดังนั้น Population เป็น FFD กับ COUNTRY แต่ไม่เกี่ยวข้องกับ RATE ดังนั้นในตัวกำหนด (ในตัวอย่างนี้คือ X หรือ Population) จะเป็นกุญแจผสมไม่ได้

การพาดพิงสมบูรณ์

 

การพาดพิงหลายค่า

การพาดพิงหลายค่า (Multiple valued dependency ย่อ MVD) MVD คือกรณีที่ตารางมีสองคอลัมน์ และคอลัมน์หนึ่งเป็น PK และอีกคอลัมน์หนึ่งมีข้อมูลแบบคอลเลคชัน (Collection ข้อมูลเป็นกลุ่ม) เช่นอาร์เรย์หรือข้อความที่ขั้นด้วยลูกน้ำ ยกตัวอย่างเช่นตารางในภาพ 6-6 ตารางล่างมีคอลัมน์ SKILLS เป็น MVD ของคอลัมน์ NAME ส่วนตารางคอลัมน์ SKILLS ไม่เป็น MVD ของคอลัมน์ NAME เพราะภายในตารางมีคอลัมน์มากกว่าสองคอลัมน์

 

การพาดพิงหลายค่า

 

การพาดพิงเป็นวงรอบ

การพาดพิงเป็นวงรอบ (Cyclic Dependency ย่อ CD) ค่าของ X ขึ้นกับค่าของ Y และในขณะเดียวกันค่าของ Y ก็ขึ้นกับค่าของ X ด้วย (ไม่ว่าจะในทางตรงหรือในทางอ้อม) CD มักเกิดขึ้นเมื่อตารางมี PK เป็น CK จากคอลัมน์สามคอลัมน์หรือมากกว่า ยกตัวอย่างเช่น X สัมพันธ์กับ Y, Y สัมพันธ์กับ Z และ X สัมพันธ์กับ Z นั่นคือ Z ย้อนกลับไปพาดพิงกับ X วนไปเช่นนี้

การพาดพิงบางส่วน

การพาดพิงบางส่วน (Partial Dependency ย่อ PD) เกิดขึ้นเมื่อคอลัมน์ใดคอลัมน์หนึ่งมีภาวะ FFD กับคอลัมน์ที่เป็น PK ซึ่งเป็น CK

โครงสร้างข้อมูลแบบ BTree

Home Page  |   รายการบทความ   |   ลิงค์ที่เกี่ยวข้อง   |   laploy.com  |  เกี่ยวกับผู้เขียน

 
โครงสร้างข้อมูลแบบ BTree

 

โปรแกรม SQL2008 จัดเก็บ NCI (Non-Clustered Index ดูรายละเอียดในหนังสือ เรียนรู้ด้วยตนเอง DataBase) โดยใช้โครงสร้างแบบ BTree การศึกษาทำความเข้าใจหลักการ BTree จะช่วยให้ท่านเข้าใจการทำงานของดรรชนีได้ดีขึ้น ดังนั้นในหัวข้อนี้ผู้เขียนจะอธิบายการทำงานของ BTree โดยสังเขป

โหนดราก (Root Node)

BTree ก็เหมือนโครงสร้างข้อมูลทั่วไปคือมีโหนด (node) เป็นองค์ประกอบพื้นฐาน BTree มีโครงสร้างเป็นลำดับชั้น โดยโหนดที่อยู่ในระดับบนสุด (หรือจะว่าเป็นระดับต่ำสุดก็ได้ขึ้นอยู่กับมุมมอง) เรียกว่าโหนดราก (Root Node ย่อ RN) ภายใน RN ประกอบด้วยตัวชี้หรือพอยน์เตอร์ (Pointer) ที่ชี้ไปยังโหนดอื่นๆ ซึ่งอยู่ในระดับต่ำกว่า เราเรียกโหนดพวกนี้ว่าโหนดในระดับใบ นอกจากนั้นเราอาจเรียกโหนดที่อยู่ระดับสูงกว่าว่า "โหนดแม่" และโหนดในระดับต่ำกว่าว่า "โหนดลูก"

 

โหนดราก (Root Node)

 

โหนดระดับใบ (Leaf Level Node)

โหนดระดับใบ (Leaf Level Node LLN) คือโหนดระดับต่ำสุดของโครงสร้างต้นไม้ BTree คือเป็นโหนดที่เก็บตัวข้อมูลจริงๆ หรือเก็บพอยน์เตอร์ที่ชี้ไปยังข้อมูล ไม่ได้เก็บพอยน์เตอร์ที่ชี้ไปยังพอยน์เตอร์

 

โหนดที่ไม่ใช่ระดับใบ (Non-Leaf Level Node)

ในการใช้งานทั่วไปฐานข้อมูลจะมีข้อมูลอยู่มากเกินกว่าที่ RN จะเก็บพอยน์เตอร์ได้หมดภายในโหนดเดียว โปรแกรม SQL2008 จึงต้องแตก RN ออกเป็นโหนดย่อยๆ อีกหนึ่งระดับ การแตกแขนงของกิ่งนี้คือการแบ่งหน้า (หรือ Page Split ที่ท่านเรียนไปแล้ว) โหนดที่เกิดขึ้นใหม่นี้ไม่ใช่ RN และ LLN จึงเรียกรวมๆ ว่าโหนดที่ไม่ใช่ระดับใบ (Non-Leaf Level Node ย่อ NLLN)

โหนดที่ไม่ใช่ระดับใบ (Non-Leaf Level Node) และ โหนดระดับใบ (Leaf Level Node)

 

ขั้นตอน PS

อย่างที่เรียนไปแล้วว่าเมื่อเกิด PS โปรแกรม SQL2008 จะย้ายแถวข้อมูลประมาณครึ่งหนึ่งจากเพจเก่าไปยังเพจใหม่ (ดูรายละเอียดในหนังสือ เรียนรู้ด้วยตนเอง DataBase)  สาเหตุที่ต้องทำเช่นนั้นเพราะต้องการรักษาสมดุลของ BTree ให้โหนดทางซ้ายและทางขวามีขนาดเท่ากัน SQL2008 ทำ PS ด้วยขั้นตอนดังนี้

  1. สร้างเพจใหม่
  2. ย้ายแถวข้อมูลจากเพจเดิมไปใส่เพจใหม่
  3. เพิ่มแถวข้อมูลใหม่เข้าสู่เพจ
  4. เพิ่มรายการ (เป็นพอยน์เตอร์) ในโหนดแม่

การแยกหน้า (Page Split) เมื่อเพจเต็ม

 

วิธีทำให้ทริกเกอร์ส่งอีเมล

 Home Page  |   รายการบทความ   |   ลิงค์ที่เกี่ยวข้อง   |   laploy.com  |  เกี่ยวกับผู้เขียน

วิธีทำให้ทริกเกอร์ส่งอีเมล

 

ในฐานะที่ท่านเป็นผู้ดูแลฐานข้อมูลหรือ DBA ท่านจำเป็นต้องรับรู้หากมีผู้แก้ไขเปลี่ยนแปลงตาราง (เฉพาะตารางที่อ่อนไหว) ในฐานข้อมูล คิวรีในภาพล่างนิยามทริกเกอร์ชื่อ reminder2 ซึ่งจะส่งอีเมลถึงท่านหากเกิดการแทรก ลบ หรืออัพเดตแถวข้อมูลในตาราง Customer

ทริกเกอร์ชื่อ reminder2 ซึ่งจะส่งอีเมลถึงท่านหากเกิดการแทรก ลบ หรืออัพเดตแถวข้อมูลในตาราง Customer

โปรดสังเกตว่านิยามนี้เหมือนกับนิยามทริกเกอร์ในตัวอย่างที่ผ่านมา ยกเว้นเปลี่ยนชื่อเป็น reminder2 และเพิ่มตัวเลือกหลังคำสั่ง AFTER ให้ตรวจจับการลบแถวข้อมูลด้วย คำสั่งบรรทัดที่ 10 ถึง 14 คือคิวรีหลักของทริกเกอร์ ซึ่งทำหน้าที่เรียกสพร็อกซ์ชื่อ sp_send_dbmail สพร็อกซ์นี้เป็นสพร็อกซ์ที่อยู่ภายใน msdb ทำหน้าที่ส่งอีเมลไปยังผู้รับที่กำหนด สิ่งที่ส่งไปในอีเมลนอกจากจะมีข้อความที่กำหนดแล้วยังอาจแนบผลลัพธ์ของคิวรีและไฟล์ต่างๆ ไปได้ด้วย

สพร็อกซ์ sp_send_dbmail มีตัวเลือกให้ใช้หลายอย่างจึงมีพารามิเตอร์เป็นจำนวนมาก แต่คิวรีในตัวอย่างนี้ส่งอาร์กิวเมนต์เพียงสี่ตัวดังนี้

  • profile_name: ชื่อผู้ส่งอีเมล
  • recipients: อีเมลแอดเดรสของผู้รับ
  • body: ข้อความในอีเมล
  • subject: ชื่อของอีเมลที่จะส่ง

สพร็อกซ์ sp_send_dbmail ส่งอีเมลโดยอาศัยบริการชื่อ Database Mail XPs หากท่านติดตั้งโปรแกรม SQL2008 โดยใช้ค่าปริยายบริการนี้จะถูกปิดอยู่ วิธีเปิดบริการทำได้โดยใช้โปรแกรม Surface Area Configuration ของ SQL2008

นิพจน์เชิงเส้น


Home Page  |   รายการบทความ   |   ลิงค์ที่เกี่ยวข้อง   |   laploy.com  |  เกี่ยวกับผู้เขียน

นิพจน์เชิงเส้น

 

นิพจน์เชิงเส้น (Linear Expression ย่อ LE) คือนิพจน์ที่แสดงการทำงานการเรียงตามลำดับของกระบวนการ เมื่อท่านต้องเขียน RAE ที่ซับซ้อนมากๆ แต่ไม่อยากใช้ RAET ท่านอาจใช้ LE แทนได้ คำว่าเชิงเส้น (Linear) ในที่นี้หมายถึงการเรียงตามลำดับของกระบวนการ คำว่ากระบวนการในที่นี้หมายถึงสิ่งที่เกิดขึ้นในการคิวรี ยกตัวอย่างเช่น RAET ในภาพล่าง  มีซีเลคชันสองสาย คือสายที่อยู่ทางซ้ายมีเงื่อนไข length ≥ 100 และสายที่อยู่ทางขวามีเงื่อนไข studioName = ‘Fox’ การทำงานของสองกระบวนการย่อยนี้ทำให้เกิด DT ที่โปรเจคชันนำไปฉายแสดงเพียงแอตทริบิวต์ title และ year

การแสดงภาพ DT นอกจากจะใช้แบบที่เห็นใน RATET แล้ว ท่านยังสามารถใช้สัญลักษณ์เชิงเส้น (Linear Notation ย่อ LN) ได้ด้วย วิธีทำคือกำหนดชื่อให้แก่โหนดต่างๆ ของต้นไม้ในแต่ละช่วงการทำงาน โดยจะกำหนดเฉพาะโหนดที่ผลิตผลลัพธ์ที่จะถูกนำไปใช้ในระดับถัดไป (คือโหนดที่ทำให้เกิด DT)

เนื่องจากลำดับการทำงานของ RAE ที่ให้ DT ย่อยไม่มีนัยยะสำคัญต่อผลของ DT ในระดับบนสุด ลำดับการกำหนดชื่อแบบ LN จึงค่อนข้างยืดหยุ่น นั่นคือหาก N เป็น DT ขั้นสุดท้าย (ตัวบนสุด) ท่านจะเรียงลำดับโหนดย่อยจะอย่างไรก็ได้ตามใจชอบ ตราบเท่าที่โหนดนั้นเป็นโหนดลูกของ N ซึ่งเป็นโหนดที่ให้ DT ก่อนถึงระดับสุดท้าย

วิธีกำหนดชื่อใน LN มีหลักการดังนี้

  1. ใช้ชื่อของรีเลชันตามด้วยวงเล็บและรายการของแอตทริบิวต์ในรีเลชันนั้น ชื่อของ DT ขั้นสุดท้ายจะใช้คำว่า Answer
  2. การกำหนดค่าให้ใช้เครื่องหมาย :=
  3. ใส่ RAE ไว้ทางขวา ท่านอาจจำกัดให้หนึ่งประโยคหรือหนึ่งบรรทัดมีเพียง RAE เดียว หรือ (ถ้าจำเป็น) จะใส่RAE ไว้หลายนิพจน์ก็ได้
 
ตัวอย่างการเขียนนิพจน์เชิงเส้น

หากนำ RAET ในภาพนี้ที่ผ่านมา มาเขียนใหม่เป็น LE จะได้ RAE ดังนี้

R(t,y,l,i,s,p) := slength100(Movie)

S(t,y,l,i,s,p) := sstudioName=’Fox’(Movie)

T(t,y,l,i,s,p) := R∩S

Answer(title, year) := pt,i(T)

บรรทัดแรกหาความสัมพันธ์ด้วยนิพจน์ slength100 บรรทัดต่อมาหาความสัมพันธ์ด้วยนิพจน์ sstudioName=’Fox และอีกสองบรรทัดสุดท้ายคือการทำอินเตอร์เซคชันและโปรเจคชันตามลำดับ

หากท่านต้องการรวบขั้นตอนบางขั้นตอนไว้ในบรรทัดเดียวก็ทำได้ ยกตัวอย่างเช่นนิพจน์สี่บรรทัดข้างบน จะเขียนรวบให้เหลือเพียงสามบรรทัดก็ได้ ผลลัพธ์จะเป็นดังนี้

R(t,y,l,i,s,p) := slength100(Movie)

S(t,y,l,i,s,p) := sstudioName=’Fox’(Movie)

Answer(title, year) := pt,i(R∩S)

นั่นคือผู้เขียนได้รวบขั้นตอนอินเตอร์เซคชันและโปรเจคชันไว้เป็นบรรทัดเดียวกัน RAE นี้จึงเหลือเพียงแค่สามบรรทัด

ตัวอย่างคิวรีหลายชั้นหาสินค้าขายเร็ว


Home Page  |   รายการบทความ   |   ลิงค์ที่เกี่ยวข้อง   |   laploy.com  |  เกี่ยวกับผู้เขียน

ตัวอย่างคิวรีหลายชั้นหาสินค้าขายเร็ว

 

เพื่อให้ประโยคกระชับอ่านง่าย ต่อไปนี้ผู้เขียนจะแทนคำว่า “คิวรีหลายชั้น” ด้วยสัญลักษณ์ µ แทนคำว่า “คิวรีหลัก” ด้วย สัญลักษณ์ λ และ “คิวรีย่อย” ด้วยสัญลักษณ์ Σ

หัวข้อนี้ผู้เขียนจะสาทิตการเขียน µ เพื่อหารายการหนังสือที่ขายได้เร็วที่สุด โจทย์คือ "จงหารายการหนังสือที่ขายออกไปในวันเดียวกันกับวันแรกที่สั่งมาเก็บในสต็อก" สมมุติว่าวันแรกที่สั่งมาเก็บในสต็อกเป็นค่าตายตัว คือวันที่ 7/4/1996 ท่านจะเขียนคิวรีได้ง่ายๆ ดังภาพ

คิวรีหารายการหนังสือที่ขายออกไปในวันเดียวกันกับวันแรกที่สั่งมาเก็บในสต็อกโดยใช้ค่าตายตัว

คิวรีที่เห็นในภาพบนใช้ฐานข้อมูล Northwind (ภาคผนวก จ 3) คิวรีนี้จอยสองตารางคือตาราง Orders ซึ่งเป็นตารางหลัก (คือ Head หรือ Master) ข้อมูลหนึ่งแถวคือการสั่งซื้อหนึ่งครั้ง และตาราง Order Details ซึ่งเป็นตารางลูก (คือ child หรือ detailed) เก็บรายละเอียดว่าการสั่งซื้อแต่ละครั้งประกอบด้วยหนังสืออะไรบ้าง

คิวรีนี้มีประโยชน์น้อย เพราะวันแรกที่สั่งหนังสือมาเก็บในสต็อกเป็นค่าตายตัวคือวันที่ 7/4/1996 ดังนั้นหากท่านล้างฐานข้อมูล (ย้ายข้อมูลไปเก็บใน Achieve หรือฐานข้อมูลที่เป็นคลังข้อมูล) วันแรกที่สั่งหนังสือมาเก็บในสต็อกจะเปลี่ยนไป คิวรีนี้จะให้ผลลัพธ์ที่ผิดทันที สิ่งที่ท่านต้องปรับปรุงคือแทนที่วันที่ 7/4/1996 ด้วยค่าจาก Σ นั่นคือท่านควรเขียน Σ เพื่อหาวันแรกที่สั่งหนังสือมาเก็บในสต็อกดังนี้

SELECT MIN(OrderDate) FROM Orders

คิวรีที่เห็นข้างบนใช้ฟังก์ชัน MIN เป็นฟังก์ชันแบบแอกริเกตเพื่อหาค่าน้อยที่สุด (ดูรายละเอียดฟังก์ชันแบบแอกริเกตของ T-SQL ในบทที่ 30) ท่านนำฟังก์ชันนี้มาหาวันสั่งซื้อที่มีค่าน้อยที่สุดจากในคอลัมน์ OrderDate ซึ่งเป็นคอลัมน์ที่มีชนิดข้อมูลวันที่ในตาราง Orders เมื่อนำคิวรีใหม่นี้มาซ้อนกับคิวรีเก่า ท่านจะได้โค้ดดังภาพนี้

เมื่อนำคิวรีใหม่ซ้อนกับคิวรีเก่าจะได้โค้ดดังนี้

ข้อควรระวังคือการเชื่อม Σ กับ λ ท่านใช้เครื่องหมายเท่ากับ ( = ) ซึ่งบอกเป็นนัยว่าสิ่งที่อยู่ทางทางซ้ายของเครื่องหมายเท่ากับ (o.OrderDate) และสิ่งที่อยู่ทางทางขวาของเครื่องหมายเท่ากับ ( Σ ) จะต้องเป็นสเกลาร์ (scalar ค่าเดี่ยว) ดังนั้นหาก Σ คืนค่ามาไม่เป็นสเกลาร์คิวรีนี้จะเออเรอร์ทันที ในตัวอย่างนี้ท่านมั่นใจได้ว่า Σ คืนค่ามาเป็นสเกลาร์เพราะเป็นการหาค่าแอกริเกต แต่ถ้าท่านเขียน Σ ที่ไม่ใช่แอกริเกต ท่านต้องตรวจสอบให้ดีว่า Σ คืนค่าเป็นสเกลาร์จริงหรือไม่