ผู้เขียน หัวข้อ: การใช้ union,union all และ select ซ้อน select  (อ่าน 23714 ครั้ง)

0 สมาชิก และ 2 บุคคลทั่วไป กำลังดูหัวข้อนี้

ออฟไลน์ yokyai

  • Hero Member
  • *****
  • กระทู้: 1,462
  • Respect: +9
    • ดูรายละเอียด
การใช้ union,union all และ select ซ้อน select
« เมื่อ: พฤษภาคม 09, 2011, 14:58:12 PM »
0
มีผลต่อระบบหรือไม่ เช่น ประมวลผลช้า
Sakaowrat Choocherd(Administrator) Information Technologist
Bangyai Hospital(30 beds)
HOSxP = 16_May_2008
Master and Slave : DELL-R730 Server Intel Xeon 8Core(2Units)
,Ram64 GB,HDD600(10k)x4,Raid5,CentOS 7.0 64 bit
,MySQL 10.1.10-MariaDB
(3 March 2016) With BMSxTraBackupGUI

ออฟไลน์ Multithreading

  • Sr. Member
  • ****
  • กระทู้: 388
  • หน่วยควบคุมโรคนำโดยแมลง(de-buger)
  • Respect: 0
    • ดูรายละเอียด
    • Android4Health
Re: การใช้ union,union all และ select ซ้อน select
« ตอบกลับ #1 เมื่อ: พฤษภาคม 09, 2011, 15:25:05 PM »
0
ยิ่งซับซ้อน   Processor ก็ยิ่งทำงานหนัก

สอนเขียน Android และ GIS


นักวิชาการสาธารณสุขปฏิบัติการ in พิษณุโลก

https://www.facebook.com/Android4Health

My Projects in HosXP field.
SurveyTool Android App
HealthPlace  Android App
HosOnDroid  Android App

============================

ออฟไลน์ udomchok

  • Hero Member
  • *****
  • กระทู้: 8,357
  • Respect: +589
    • ดูรายละเอียด
    • ร.พ.สมเด็จพระสังฆราช องค์ที่ 17
Re: การใช้ union,union all และ select ซ้อน select
« ตอบกลับ #2 เมื่อ: พฤษภาคม 09, 2011, 16:00:04 PM »
0
วันนี้เพิ่งได้ trick มา
*** พิมพ์ตกไปหน่อยครับ ตรงตัวหนาสีแดงนะครับ ***แบบนี้ใช่ไหมที่เรียกว่า select ซ้อน select
select o.vn, o.an, o.icode, o.rxdate
from opitemrece o
where o.icode in (select icode from drugitem where name like "paracet%") and o.rxdate bewteen "2009-10-01" and "2010-09-30"
ข้อดีคือส่ง sql นี้ไป ใช้ได้ทุก ร.พ. ก็จะได้ข้อมูลการใช้ยา paracet ทุกรูปแบบ เม็ด น้ำ ฉีด...

ลอง run เปรียบเทียบกับ
select o.vn, o.an, o.icode, o.rxdate
from opitemrece o
where o.icode in ("1xxxxxxx","1zzzzzzzz","1vvvvvvvv","1aaaaaaa","1cccccccc") and o.rxdate bewteen "2009-10-01" and "2010-09-30"
จะเห็นว่าแบบที่ 2 เร็วกว่า อย่างเห็นได้ชัด แต่แบบที่สองมีข้อเสียคือต้องรู้ icode ของยานั้น คือต้องแก้ไข sql ให้ถูก

แบบที่สาม ใช้ join กับ temp table
select o.vn, o.an, o.icode, o.rxdate
from opitemrece o
join (select icode from drugitem where name like "paracet%") as temp on temp.icode=o.icode
where o.rxdate bewteen "2009-10-01" and "2010-09-30"
ผมลองกับข้อมูล Lab จำนวนมาพบว่าแบบที่สามนี่เร็วมาก ๆ ครับ

โจทย์คือต้องการทราบว่าผู้ป่วยที่ใช้ยา xxxx มีตรวจ lab อะไรบ้าง ยา xxxx  มี icode หลายตัว เนื่องจากมีหลายรูปแบบและหลายความแรง

เอาแค่นี้ก่อน

ผมก็เขียน sql ดึงข้อมูลแบบนี้
select distinct if(o.vn is null,a.vn,o.vn) as vn
from opitemrece o
where o.icde in (select icode from drugitems where name like "xxxxx%")
and o.rxdate between "2009-10-01' and "2010-09-30"
เพื่อดึงว่ามี vn ไหนบ้างที่ใช้ยานี้ ก็ได้ VN ออกมา เพื่อเอาไปเชื่อมกับข้อมูลการสั่ง LAB จาก lab_order_service

ถ้าใช้ select ซ้อน select ก็จะเขียนแบบนี้ครับ
select * from lab_order_service where vn in (
select distinct if(o.vn is null,a.vn,o.vn) as vn
from opitemrece o
where o.icde in (select icode from drugitems where name like "xxxxx%")
and o.rxdate between "2009-10-01' and "2010-09-30")
จะเห็นว่ามี select ซ้อน select ซ้อนอยู่ใน  select อีกที 3 ชั้น
อันนี้ run ช้ามาก

หากเปลี่ยนเป็น
select * from lab_order_service where vn in (
select distinct if(o.vn is null,a.vn,o.vn) as vn
from opitemrece o
where o.icde in ("1zzzzzz","1xxxxxx","1cccccc","1vvvvvv","1aaaaaa")
and o.rxdate between "2009-10-01' and "2010-09-30")
จะ run ได้เร็วขึ้นอีกหน่อย

ลองเปลี่ยนมาเป็นแบบนี้ครับเร็วขึ้น
select los.*
from lab_order_service los
join
(select distinct if(o.vn is null,a.vn,o.vn) as vn
from opitemrece o
where o.icde in ("1zzzzzz","1xxxxxx","1cccccc","1vvvvvv","1aaaaaa")
and o.rxdate between "2009-10-01' and "2010-09-30") as temp2 on temp2.vn=los.vn

สุดท้ายเปลี่ยนมาเป็นแบบนี้ครับเร็วอย่างมากมาย
select los.*
from lab_order_service los
join
(select distinct if(o.vn is null,a.vn,o.vn) as vn
from opitemrece o
join (select icode from drugitems where name like "xxxx") as temp on temp.icode=o.icode
where o.rxdate between "2009-10-01' and "2010-09-30") as temp2 on temp2.vn=los.vn
« แก้ไขครั้งสุดท้าย: พฤษภาคม 09, 2011, 21:45:39 PM โดย udomchok »
ทำด้วยหัวใจร.พ.สมเด็จพระสังฆราช องค์ที่ 17 อ.สองพี่น้อง จ.สุพรรณบุรี
อบรมโดย BMS Team เมื่อ พ.ย. 49 ขึ้นระบบห้องบัตรเมื่อ X'Mas 2007
2008 : X-Ray กายภาพบำบัด แพทย์แผนไทย กิจกรรมบำบัด OPD ตา
2009 : ทันตกรรม ห้องตรวจตา OPD (พยาบาลและห้องตรวจแพทย์บางห้อง)

ออฟไลน์ udomchok

  • Hero Member
  • *****
  • กระทู้: 8,357
  • Respect: +589
    • ดูรายละเอียด
    • ร.พ.สมเด็จพระสังฆราช องค์ที่ 17
Re: การใช้ union,union all และ select ซ้อน select
« ตอบกลับ #3 เมื่อ: พฤษภาคม 09, 2011, 21:40:37 PM »
0
อันนี้ที่ทดลองทำจริงครับ เร็วมาก ข้อมูลตั้งแต่ 1 ต.ค. 52 ถึง 6 พ.ค. 54

select los.*
from lab_order_service los
join
(select distinct if(o.vn is null,o.an,o.vn) as vn
from opitemrece o
join (select icode from drugitems where name like "pioglita%") as temp2 on temp2.icode=o.icode
and o.rxdate between "2009-10-01" and "2011-05-06") as temp
on temp.vn=los.vn
ทำด้วยหัวใจร.พ.สมเด็จพระสังฆราช องค์ที่ 17 อ.สองพี่น้อง จ.สุพรรณบุรี
อบรมโดย BMS Team เมื่อ พ.ย. 49 ขึ้นระบบห้องบัตรเมื่อ X'Mas 2007
2008 : X-Ray กายภาพบำบัด แพทย์แผนไทย กิจกรรมบำบัด OPD ตา
2009 : ทันตกรรม ห้องตรวจตา OPD (พยาบาลและห้องตรวจแพทย์บางห้อง)

ออฟไลน์ panus_t

  • Hero Member
  • *****
  • กระทู้: 2,368
  • Respect: +8
    • ดูรายละเอียด
Re: การใช้ union,union all และ select ซ้อน select
« ตอบกลับ #4 เมื่อ: กรกฎาคม 16, 2012, 10:48:18 AM »
0
อันนี้ที่ทดลองทำจริงครับ เร็วมาก ข้อมูลตั้งแต่ 1 ต.ค. 52 ถึง 6 พ.ค. 54

select los.*
from lab_order_service los
join
(select distinct if(o.vn is null,o.an,o.vn) as vn
from opitemrece o
join (select icode from drugitems where name like "pioglita%") as temp2 on temp2.icode=o.icode
and o.rxdate between "2009-10-01" and "2011-05-06") as temp
on temp.vn=los.vn

ช่วยอ่าน code ให้หน่อยครับ ผมพยายามแล้วครับแต่ยัง งง งง
โรงพยาบาลเสิงสาง จ.นครราชสีมา (ขนาด  60  เตียง ปี2554)  ขึ้นระบบโดยทีมงาน BMS  เมื่อเดือนเมษายน 2551
ก่อนหน้านั้นขึ้นระบบเมื่อ 07/07/07 ฤกษ์ดี  Master Server  IBM System x3500M4  RAM ECC 24 GB. HardDisk SAS 450x3 GB. ServerRAID M1100 Series Zero RAID5  OS:CentOS 6.4  MySQLPercona : 5.5.30-30.1

ออฟไลน์ Multithreading

  • Sr. Member
  • ****
  • กระทู้: 388
  • หน่วยควบคุมโรคนำโดยแมลง(de-buger)
  • Respect: 0
    • ดูรายละเอียด
    • Android4Health
Re: การใช้ union,union all และ select ซ้อน select
« ตอบกลับ #5 เมื่อ: กรกฎาคม 16, 2012, 12:42:31 PM »
0
ผมชอบอ่านแบบ ดูทีละวงเล็บ จากในไปหานอก ครับ

สอนเขียน Android และ GIS


นักวิชาการสาธารณสุขปฏิบัติการ in พิษณุโลก

https://www.facebook.com/Android4Health

My Projects in HosXP field.
SurveyTool Android App
HealthPlace  Android App
HosOnDroid  Android App

============================

ออฟไลน์ Svl2Nuk3

  • Hero Member
  • *****
  • กระทู้: 793
  • Respect: 0
    • ดูรายละเอียด
Re: การใช้ union,union all และ select ซ้อน select
« ตอบกลับ #6 เมื่อ: กรกฎาคม 16, 2012, 21:01:45 PM »
0
อันนี้ที่ทดลองทำจริงครับ เร็วมาก ข้อมูลตั้งแต่ 1 ต.ค. 52 ถึง 6 พ.ค. 54

select los.*
from lab_order_service los
join
(select distinct if(o.vn is null,o.an,o.vn) as vn
from opitemrece o
join (select icode from drugitems where name like "pioglita%") as temp2 on temp2.icode=o.icode
and o.rxdate between "2009-10-01" and "2011-05-06") as temp
on temp.vn=los.vn

ช่วยอ่าน code ให้หน่อยครับ ผมพยายามแล้วครับแต่ยัง งง งง
หมายถึงให้อธิบายความหมายหรือเปล่าครับ

คือดึงข้อมูลจาก lab_order_server ทุกฟิล  ของผู้ป่วยนอกและผู้ป่วยใน   ที่ได้รับยาที่มีคำว่า pioglita  และได้รับยาระหว่างวันที่  "2009-10-01" - "2011-05-06"
I'm nuke (นุ๊ก)
My Blog  : http://www.codenuke.net
อดีต นวก.คอมฯ รพช.พรหมพิราม => 1 พ.ค. 52 - 30 ก.ย. 54
ปัจจุบัน : Software Engineer บริษัทแห่งหนึ่ง