มี MySQL เทียบเท่ากับประโยคใน Oracle?
มี MySQL เทียบเท่ากับประโยคใน Oracle?
คำตอบ:
นั่นไม่ใช่. เว้นแต่ (จนกว่า) จะมีการพัฒนา (MySQL เป็นโอเพนซอร์สทุกคนสามารถมีส่วนร่วมได้)
WITH
คีย์เวิร์ดANSI / ISO SQL ใช้เพื่อกำหนด Common Table Expressions (CTEs) และช่วยลดความซับซ้อนของเคียวรีที่ซับซ้อนด้วยการอ้างอิงแบบซ้อนหนึ่งหรือหลายแบบ มันมีอยู่ใน Oracle, Postgres, SQL-Server, DB2 แต่ไม่ใช่ใน MySQL
แบบสอบถามสุดท้ายอาจมีการอ้างอิง (โดยปกติจะอยู่ในFROM
ข้อ แต่อาจอยู่ในส่วนอื่น ๆ ) ให้กับทุกคนที่มีการแสดงออกของตารางทั่วไปอย่างน้อยหนึ่งครั้ง สามารถเขียนแบบสอบถาม (ไม่มี CTEs) ใน MySQL โดยใช้ตารางที่ได้รับ แต่การอ้างอิงจะต้องทำซ้ำ ๆ
ตัวอย่างของข้อความค้นหาโง่ ๆ ที่แสดงให้เห็นว่าทุกคนเกิดใน 50 ปีและในเดือนกรกฎาคมและจำนวนคนทั้งหมดที่เกิดในปีเดียวกัน:
WITH a AS
( SELECT name, birthdate, YEAR(birthdate) AS birthyear
FROM persons
WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01'
)
, b AS
( SELECT birthyear, COUNT(*) AS cnt
FROM a
GROUP BY birthyear
)
SELECT a.name, a.birthdate, b.cnt AS number_of_births
FROM a JOIN b
ON a.birthyear = b.birthyear
WHERE MONTH(a.birthdate) = 7 ;
ใน MySQL มันสามารถเขียนเป็น:
SELECT a.name, a.birthdate, b.cnt AS number_of_births
FROM
( SELECT name, birthdate, YEAR(birthdate) AS birthyear
FROM persons
WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01'
) AS a
JOIN
( SELECT birthyear, COUNT(*) AS cnt
FROM
( SELECT name, birthdate, YEAR(birthdate) AS birthyear
FROM persons
WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01'
) AS aa
GROUP BY birthyear
) AS b
ON a.birthyear = b.birthyear
WHERE MONTH(a.birthdate) = 7 ;
a
ขอให้สังเกตการทำสำเนาของรหัสสำหรับตารางที่ได้รับ ในแบบสอบถามที่ซับซ้อนมากขึ้นรหัสจะต้องถูกเขียนหลายครั้ง
ที่จะทำงาน แต่ก็น่าเสียดายที่มันจะไม่ให้ประโยชน์จากการใช้คำสั่ง WITH ที่ไม่ได้ดำเนินการแบบสอบถามเดียวกันหลายครั้ง (ด้วยแบบสอบถามที่ซับซ้อนอาจ reaaaally ช้าและเรียกร้องมากสำหรับเครื่องมือฐานข้อมูลนั้นฉันประสบมัน) .
ฉันขอแนะนำให้ใส่แต่ละ SELECT เดิมที่กำหนดไว้ในข้อลงในตารางชั่วคราวของตัวเองและใช้พวกเขาภายในแบบสอบถาม ใน MySQL ตารางชั่วคราวจะลดลงเมื่อเซสชันผู้ใช้สิ้นสุด
แก้ไข:
ฉันเพิ่งเห็นคำตอบนี้ในชุดข้อความที่คล้ายกันซึ่งแสดงวิธีแก้ปัญหาทั้ง 3 อย่างด้วย MySQL :
/programming//a/1382618/2906290
และตัวอย่างของโพรซีเดอร์ MySQL ที่สร้างและวางตารางชั่วคราวในกรณีที่คุณดำเนินการต่อกับเซสชันของคุณและต้องการเพิ่มทรัพยากรเหล่านั้น (ฉันจะใช้มันเป็นตัวอย่างของไวยากรณ์): /programming//a/ 5553145/2906290