ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 5237|ตอบกลับ: 3

[VB.NET] พื้นฐานของ SQL Joins ระหว่างตารางข้อมูล 2 ตาราง

[คัดลอกลิงก์]

309

กระทู้

500

โพสต์

6030

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6030


ในบทความนี้ แอดมินจะจำลอง เพื่อแสดงให้เห็นถึงการจอย (JOIN) หรือเชื่อมความสัมพันธ์ระหว่างตารางข้อมูล 2 ตารางเข้าหากัน ด้วยวิธีการกระจายข้อมูลออกให้เห็นในรูปแบบของเซ็ต (SET) โดยใช้ไฟล์ฐานข้อมูล Microsoft Access มาเป็นตัวอย่าง ซึ่งมันก็ใช้ไวยากรณ์ที่คล้ายๆกันฐานข้อมูลตัวอื่นๆนั่นแหละครับท่านผู้ชม ...

สมมุติชื่อเล่นตาราง A คือ ตารางนักศึกษา (Student)
สมมุติชื่อเล่นตาราง B คือ ตารางอาจารย์ที่ปรึกษา (Advisor)
ในการแจกแจงสมาชิกท่านต้องกลับไปเปิดจากคณิตศาสตร์ ม.4 เทอม 1 ดูกันเองครับ ... สรุปให้สั้นๆ คือ ...
- Student 1 และ 9 มี Advisor 1 เป็นที่ปรึกษา ส่วน Student 5, 7, และ 10 มีอาจารย์ Advisor 3 เป็นที่ปรึกษา
- Student 2 และ 4 ไม่มีความสัมพันธ์ของตารางข้อมูลกับอาจารย์ที่ปรึกษาคนใด และ Advisor 5 ก็ไม่ได้เป็นที่ปรึกษาให้แก่นักศึกษาคนใด พวกนี้จัดว่าอยู่นอกเหนือความสัมพันธ์กัน
หมายเหตุ: AdvisorFK คือคีย์รองจากตาราง Student (เพราะคีย์หลักตารางนี้คือ StudentPK) ที่เชื่อมกลับไปหาคีย์หลัก AdvisorPK ซึ่งความหมายก็คือตัวเดียวกันนั่นแหละครับ
กรณี Inner Join (หรือ อินเตอร์เซคชัน Intersection) ...

พบว่าตาราง A และ B หากมีความสัมพันธ์กันแบบไร้เงื่อนไขก็จะมีสมาชิกอยู่ 5 รายการ ซึ่งกรณีของ Inner Join นี้เราต้องใช้งานบ่อยมาก
  1. SELECT Student.StudentPK, Student.StudentName, Advisor.AdvisorName
  2. FROM Student INNER JOIN Advisor ON Student.AdvisorFK = Advisor.AdvisorPK
  3. ORDER BY Student.StudentPK
คัดลอกไปที่คลิปบอร์ด
ตาราง A JOIN กับตาราง B เมื่อคีย์รอง AdvisorFK มีค่าเท่ากับคีย์หลัก AdvisorPK

ความหมายคือ รายชื่อของนักศึกษาที่มีอาจารย์เป็นที่ปรึกษาเรียบร้อย

กรณี Left Join ...

ประกอบไปด้วยสมาชิก 7 รายการ
  1. SELECT Student.StudentPK, Student.StudentName, Advisor.AdvisorName
  2. FROM Student LEFT JOIN Advisor ON Student.AdvisorFK = Advisor.AdvisorPK
  3. ORDER BY Student.StudentPK
คัดลอกไปที่คลิปบอร์ด

Student 2 ต้องให้ Advisor 8 เป็นที่ปรึกษา แต่ทว่า Advisor 8 ไม่มีรายชื่อปรากฏอยู่ในตาราง Advisor (กรณี Student 4 ก็เหมือนกัน คือมี Advisor 2 เป็นที่ปรึกษา แต่ที่ปรึกษาไม่ได้อยู่ในตาราง Advisor)

กรณี Right Join ...

ประกอบด้วยสมาชิก 6 รายการ
  1. SELECT Student.StudentPK, Student.StudentName, Advisor.AdvisorName
  2. FROM Student RIGHT JOIN Advisor ON Student.AdvisorFK = Advisor.AdvisorPK
  3. ORDER BY Student.StudentName
คัดลอกไปที่คลิปบอร์ด

หมายความว่า Advisor 5 ยังไม่ได้เป็นที่ปรึกษาให้นักศึกษาคนใดๆเลย

ทั้งสองตาราง หากมาทำ Union หรือ Full Outer Join กัน

ก็จะมีสมาชิกทั้งหมด 8 รายการ อ้าววว ทำไมไม่ใช่ 10 ล่ะ ... ก็เพราะว่ามันมีความสัมพันธ์กันอยู่ 5 รายการ และไม่เกี่ยวข้องกันทางซ้าย 2 รายการ และไม่เกี่ยวข้องกันทางขวา 1 รายการ เลยรวมได้แค่ 8 รายการนั่นเอง
  1. SELECT Student.StudentPK, Student.StudentName, Student.AdvisorFK, Advisor.AdvisorPK
  2. FROM Student LEFT JOIN Advisor ON Student.AdvisorFK = Advisor.AdvisorPK
  3. UNION
คัดลอกไปที่คลิปบอร์ด

กรณีของ MS Access จะไม่มีคำสั่ง SQL ในการ Full Outer Join เราแก้ปัญหานี้ด้วยการใช้ LEFT และ RIGHT มารวมกันแทนครับผม

โค้ด VB.NET เพื่อช่วยในการเรียนรู้และเสริมสร้างความเข้าใจ ...
  1. Imports System.Data.OleDb

  2. Public Class frmJoinDBMethod
  3.     Dim Conn As OleDbConnection

  4.     ' / --------------------------------------------------------------------------------
  5.     ' / FIRST : Connect MS Access DataBase
  6.     Public Function ConnectDataBase() As System.Data.OleDb.OleDbConnection
  7.         Dim strPath As String = Application.StartupPath.ToLower
  8.         '// MS Access 2007+ DB at data folder.
  9.         strPath = strPath.Replace("\bin\debug", "\data").Replace("\bin\release", "\data").Replace("\bin\x86\debug", "\data")
  10.         If Microsoft.VisualBasic.Right(strPath, 1) <> "" Then strPath = strPath + ""
  11.         Try
  12.             '//
  13.             Dim strConn As String = _
  14.                 "Provider = Microsoft.ACE.OLEDB.12.0;"
  15.             strConn += _
  16.                 "Data Source = " & strPath & "SampleJoin.accdb"

  17.             Conn = New OleDb.OleDbConnection(strConn)
  18.             '// Connection (Conn)
  19.             Conn.ConnectionString = strConn
  20.             '// Return Connection
  21.             Return Conn
  22.         Catch ex As Exception
  23.             MessageBox.Show(ex.Message)
  24.             Conn = Nothing
  25.             Return Conn
  26.         End Try
  27.     End Function

  28.     Private Sub frmLeftRightInnerJoin_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  29.         Me.CenterToScreen()
  30.         ' / --------------------------------------------------------------------------------
  31.         ' Setup DataGridView @Run Time
  32.         With dgvData
  33.             .RowHeadersVisible = False
  34.             .AllowUserToAddRows = False
  35.             .AllowUserToDeleteRows = False
  36.             .AllowUserToResizeRows = False
  37.             .MultiSelect = False
  38.             .SelectionMode = DataGridViewSelectionMode.FullRowSelect
  39.             .ReadOnly = True
  40.             .Font = New Font("Tahoma", 9)
  41.             ' Header style
  42.             With .ColumnHeadersDefaultCellStyle
  43.                 .BackColor = Color.Navy
  44.                 .ForeColor = Color.White
  45.                 .Font = New Font(dgvData.Font, FontStyle.Bold)
  46.             End With
  47.             '// Auto adjust columns size.
  48.             dgvData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  49.             dgvData.AutoResizeColumns()
  50.         End With
  51.         '//
  52.         Conn = ConnectDataBase()
  53.         lblRecordCount.Text = ""
  54.     End Sub

  55.     ' / --------------------------------------------------------------------------------
  56.     ' / Sub Program to show Inner, Left and Right Join
  57.     Private Sub RetrieveData(Optional ByVal JoinType As Byte = 0)
  58.         Dim strSQL As String
  59.         '// 0 = Inner, 1 = Left and 2 = Right Join, 3 = Union
  60.         Select Case JoinType
  61.             '// INNER JOIN
  62.             Case 0
  63.                 strSQL = _
  64.                     " SELECT Student.StudentPK, Student.StudentName, Advisor.AdvisorName " & _
  65.                     " FROM Student INNER JOIN Advisor ON Student.AdvisorFK = Advisor.AdvisorPK " & _
  66.                     " ORDER BY Student.StudentPK "

  67.                 '// LEFT JOIN
  68.             Case 1
  69.                 strSQL = _
  70.                     " SELECT Student.StudentPK, Student.StudentName, Advisor.AdvisorName " & _
  71.                     " FROM Student LEFT JOIN Advisor ON Student.AdvisorFK = Advisor.AdvisorPK " & _
  72.                     " ORDER BY Student.StudentPK "

  73.                 '// RIGHT JOIN
  74.             Case 2
  75.                 strSQL = _
  76.                     " SELECT Student.StudentPK, Student.StudentName, Advisor.AdvisorName " & _
  77.                     " FROM Student RIGHT JOIN Advisor ON Student.AdvisorFK = Advisor.AdvisorPK " & _
  78.                     " ORDER BY Student.StudentName "

  79.                 '// UNION
  80.             Case 3
  81.                 strSQL = _
  82.                     " SELECT Student.StudentPK, Student.StudentName, Student.AdvisorFK, Advisor.AdvisorPK " & _
  83.                     " FROM Student LEFT JOIN Advisor ON Student.AdvisorFK = Advisor.AdvisorPK " & _
  84.                     " UNION " & _
  85.                     " SELECT Student.StudentPK, Student.StudentName, Student.AdvisorFK, Advisor.AdvisorPK " & _
  86.                     " FROM Student RIGHT JOIN Advisor ON Student.AdvisorFK = Advisor.AdvisorPK "
  87.                 '" FROM Advisor LEFT JOIN Student ON Advisor.AdvisorPK = Student.AdvisorFK "

  88.         End Select
  89.         '// Start
  90.         Try
  91.             If Conn.State = ConnectionState.Closed Then Conn.Open()
  92.             Dim Cmd As New OleDb.OleDbCommand(strSQL, Conn)
  93.             Dim Reader As OleDb.OleDbDataReader = Cmd.ExecuteReader
  94.             Dim DT As DataTable = New DataTable
  95.             DT.Load(Reader)
  96.             dgvData.DataSource = DT
  97.             DT.Dispose()
  98.         Catch ex As Exception
  99.             MessageBox.Show(ex.Message)
  100.         End Try
  101.         '//
  102.         lblRecordCount.Text = "[Total : " & dgvData.RowCount & " Records.]"
  103.     End Sub

  104.     '// INNER
  105.     Private Sub itemInner_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles itemInner.Click
  106.         Call RetrieveData(0)
  107.     End Sub

  108.     '// LEFT
  109.     Private Sub itemLeft_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles itemLeft.Click
  110.         Call RetrieveData(1)
  111.     End Sub

  112.     '// RIGHT
  113.     Private Sub itemRight_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles itemRight.Click
  114.         Call RetrieveData(2)
  115.     End Sub

  116.     '// UNION
  117.     Private Sub itemFull_Click(sender As System.Object, e As System.EventArgs) Handles itemFull.Click
  118.         Call RetrieveData(3)
  119.     End Sub

  120.     Private Sub itemClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles itemClose.Click
  121.         Me.Close()
  122.     End Sub

  123.     Private Sub frmLeftRightInnerJoin_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  124.         If Conn.State = ConnectionState.Open Then Conn.Close()
  125.         Me.Dispose()
  126.         Application.Exit()
  127.     End Sub

  128. End Class
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

0

กระทู้

58

โพสต์

10

เครดิต

Member

Rank: 2

เครดิต
10
โพสต์ 2022-10-25 18:54:27 | ดูโพสต์ทั้งหมด

ขอบคุณครับ

0

กระทู้

33

โพสต์

372

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
372
โพสต์ 2022-12-11 21:10:51 | ดูโพสต์ทั้งหมด

ขอบพระคุณคัพ อาจารย์

1

กระทู้

12

โพสต์

155

เครดิต

Member

Rank: 2

เครดิต
155
โพสต์ 2023-9-12 12:15:38 | ดูโพสต์ทั้งหมด

ขอบคุณครับ
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-4-19 15:45 , Processed in 0.200092 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้