Mine

รูปภาพของฉัน
หาดใหญ่, ภาคใต้, Thailand
ชอบเอาใจ แต่ก็เอาแต่ใจ

วันจันทร์ที่ 13 กันยายน พ.ศ. 2553

การเขียน SQL แบบอ้างอิงตารางเดียวกันแต่คนละข้อมูล

สวัสดีค่ะ วันนี้แอบเข้าไปดูในสถิติของตนเอง พบว่ามีคนค้นหาทาง Google ด้วยค่ะ คริคริ ...แล้วก็แอบมาคลิก web ของเราด้วย แสดงว่าที่เราเขียนไปก็ไม่เสียเปล่า (มีความสุขนะเนี่ยะ)

แล้วก็พบว่าส่วนหนึ่งของคำที่ค้นหา คือ "postgresql อ้างอิงตารางเดียวสองครั้ง" 
ทำให้กลับมาคิดว่า เราน่าจะเอาความรู้พื้นฐานมาเขียนบ้าง เพราะว่า บางทีเอาตัวอย่างการใช้งานจริงมาเขียนจะยากไปสำหรับคนที่เข้ามาศึกษาใหม่ แล้วอาจจะไม่เกิดประโยชน์ก็ได้ ดังนั้นวันนี้ก็ขอเอาใจกับคนที่ Search จากข้อความข้างต้นนะคะ ไม่รู้ว่าจะเข้ามาอ่านอีกหรือเปล่า

สำหรับการเขียน Query หรือ เขียน SQL นั้นโดยส่วนใหญ่ภาษาที่ใช้ในแต่ละฐานข้อมูลก็จะเหมือนกัน แต่อาจจะต่างกันบางคำสั่ง หรือบาง Function ค่ะ ในที่นี้ขออ้างอิง PostgreSQL แล้วกันนะ (ก็นู๋ถนัดอันนี้นี่นา)

รูปแบบการเขียน Query พื้นฐาน
select fieldName
from tableName
where condition

ส่วนคำสั่งพื้นฐานอื่นๆ จะไม่ขอกล่าวถึงใน บทความเรื่องนี้ นะคะ เอาไว้จะหาโอกาสเขียนให้อีกครั้งละกันค่ะ

postgresql อ้างอิงตารางเดียวสองครั้ง 

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


select t_patient_id
,t_patient.patient_hn
,t_patient.patient_firstname
,t_patient.patient_lastname
,t_patient.patient_birthday
,t_patient.patient_house
,t_patient.patient_road
,t_patient.patient_moo
--เวลาอ้างถึงเพื่อแสดงผล หรือเพื่อนำไปใช้เป็นเงื่อนไขก็ต้องอ้างชื่อที่เราตั้งใหม่นะคะ
--หากเราอ้างถึง f_address แล้วละก็ฐานข้อมูลจะมองเป็นตารางที่ 4 ทันทีเลย ทีนี้ข้อมูลเราเบิ้ลแน่ๆค่ะ เพราะไม่มีการ join

,district.address_description
as district
,amphur.address_description
as amphur
,province.address_description
as province
from t_patient
inner join f_address as district --ตรงนี้ตั้งชื่อเล่นใหม่ค่ะเป็น district
    on t_patient.patient_tambon = district.f_address_id
 
inner join f_address as amphur --ตรงนี้ตั้งชื่อเล่นใหม่ค่ะเป็น amphur
    on t_patient.patient_amphur = amphur.f_address_id
 inner join f_address as province
--ตรงนี้ตั้งชื่อเล่นใหม่ค่ะเป็น province
    on t_patient.patient_changwat = province.f_address_id
where t_patient.patient_active = '1'
    and t_patient.patient_record_date_time like '2553%'
limit 100;



เท่านี้เราก็สามารถอ้างถึงตารางเดียวกันแบบที่ไม่ทำให้ฐานข้อมูลเราสับสนได้แล้วค่ะ ...

ไม่มีความคิดเห็น:

แสดงความคิดเห็น