SQL ต้องการเคียวรีย่อยหรือไม่?
ลองนึกภาพการนำภาษาคิวรีที่มีโครงสร้างมาใช้อย่างพอเพียงสำหรับฐานข้อมูลที่เกี่ยวข้อง เนื่องจากโครงสร้างของSELECT
คำสั่งcanonical SQL นั้นค่อนข้างสำคัญสำหรับเรื่องนี้ฉันจึงไม่สนใจโดยตรงกับพีชคณิตเชิงสัมพันธ์ แต่คุณสามารถใส่กรอบนี้ในเทอมเหล่านั้นโดยกำหนดข้อ จำกัด ที่เหมาะสมในรูปแบบของนิพจน์
SQL แบบSELECT
แบบสอบถามโดยทั่วไปประกอบด้วยการฉาย (คนSELECT
ส่วน) จำนวนบางส่วนของJOIN
การดำเนินงาน (คนJOIN
ส่วน) จำนวนของSELECTION
การดำเนินงาน (ใน SQL ที่WHERE
คำสั่ง) และจากนั้นตั้งฉลาดการดำเนินงาน ( UNION
, EXCEPT
, INTERSECT
ฯลฯ ) ตามมาด้วยอีกSELECT
แบบสอบถามSQL
ตารางที่เข้าร่วมสามารถเป็นผลลัพธ์ของนิพจน์ที่คำนวณได้ กล่าวอีกนัยหนึ่งเราสามารถมีคำสั่งเช่น:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN (SELECT id, address
FROM table2 AS t3
WHERE t3.id = t1.id) AS t2
WHERE t1.salary > 50,000;
เราจะอ้างถึงการใช้ตารางที่คำนวณเป็นส่วนหนึ่งของแบบสอบถาม SQL เป็นแบบสอบถามย่อย ในตัวอย่างข้างต้นที่สอง (เยื้อง) SELECT
เป็นแบบสอบถามย่อย
แบบสอบถาม SQL ทั้งหมดสามารถเขียนในลักษณะที่จะไม่ใช้แบบสอบถามย่อยหรือไม่? ตัวอย่างข้างต้นสามารถ:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN table2 AS t2
ON t1.id = t2.id
WHERE t1.salary > 50,000;
ตัวอย่างนี้เป็นของปลอมหรือไม่สำคัญ แต่ก็สามารถจินตนาการได้ว่ามีกรณีที่ต้องใช้ความพยายามมากขึ้นในการกู้คืนนิพจน์ที่เทียบเท่า กล่าวอีกนัยหนึ่งคือทุกกรณีของแบบสอบถาม SQL ที่มีรีย่อยมีไม่มีใด ๆ ที่รับประกันและเพื่อสร้างผลลัพธ์เดียวกันสำหรับตารางต้นแบบเดียวกันหรือไม่ ให้เรา จำกัด แบบสอบถาม SQL ไปยังแบบฟอร์มต่อไปนี้:
SELECT <attribute>,
...,
<attribute>
FROM <a table, not a subquery>
JOIN <a table, not a subquery>
...
JOIN <a table, not a subquery>
WHERE <condition>
AND <condition>
...
AND <condition>
UNION
-or-
EXCEPT
-or-
<similar>
SELECT ...
และอื่น ๆ ฉันคิดว่าการเข้าร่วมด้านนอกและด้านขวาไม่เพิ่มมากนัก แต่ถ้าฉันเข้าใจผิดโปรดอย่าลังเลที่จะชี้ให้เห็นว่า ... ในทุก ๆ กรณีพวกเขาเป็นเกมที่ยุติธรรมเช่นกัน เท่าที่การปฏิบัติการตั้งไว้ฉันเดาว่าสิ่งเหล่านั้นดี ... ยูเนี่ยนความแตกต่างความแตกต่างสมมาตรทางแยก ฯลฯ ... ทุกอย่างที่เป็นประโยชน์ มีรูปแบบที่รู้จักกันซึ่งแบบสอบถาม SQL ทั้งหมดจะลดลง? ทำสิ่งเหล่านี้กำจัดแบบสอบถามย่อยหรือไม่? หรือมีบางกรณีที่ไม่มีการสืบค้นที่ไม่มีคิวรีย่อย การอ้างอิงได้รับการชื่นชม ... หรือการสาธิต (โดยหลักฐาน) ว่าพวกเขาเป็นหรือไม่จำเป็นต้องใช้จะยอดเยี่ยม ขอขอบคุณและขออภัยหากนี่คือผลลัพธ์ที่โด่งดัง (หรือไม่สำคัญ) ซึ่งฉันไม่รู้ด้วยความเจ็บปวด
select count(*) from (select id from sometable group by id having count(*)>1) d
ตัวอย่างปกติฉันมีกำหนดแบบสอบถามย่อยเป็นรายการที่ซ้ำกันนับ: เพราะมันรวมถึงgroup by
ฉันยังไม่ได้ใส่คำตอบนี้
ON
จำเป็นต้องใช้ clause สำหรับJOIN
s แม้ว่าจะได้รับผลิตภัณฑ์ข้ามโดยใช้เครื่องหมายจุลภาค