ความเท่าเทียมกันทางคณิตศาสตร์ของคำสั่ง SQL สองคำสั่ง


9

มีวิธีการตรวจสอบความเท่าเทียมกันทางคณิตศาสตร์ของคำสั่ง SQL สองคำสั่งหรือไม่?

ฉันมีคำสั่ง SQL สองคำ:

  • SQL_STATEMENT_1
  • SQL_STATEMENT_2

การเรียกใช้ทั้งคำสั่งเกี่ยวกับข้อมูลและการเปรียบเทียบผลลัพธ์ไม่ได้ช่วยอะไรเลย

ชุดคณิตศาสตร์เบื้องหลังคำสั่งจะต้องได้รับการประเมินเช่นเดียวกับตัวแก้สมการ

ขอบเขตคำถามของฉันเป็นสิ่งที่ชอบ:

  • เปรียบเทียบอื่น ๆ แล้วความเท่าเทียมกัน (มากกว่า, น้อยกว่า, LIKE, ... )
  • ขั้นตอนการจัดเก็บหรือทริกเกอร์
  • นิพจน์ตารางทั่วไป (ด้วย)

ในขอบเขต:

  • Subselects: WHERE other_id IN (เลือก id จาก other WHERE ... )
  • จับ

โซลูชันบางส่วนจะเปรียบเทียบแผนการดำเนินการของ 2 คิวรี หากแผนการดำเนินการเหมือนกันพวกเขาจะเท่ากัน อย่างไรก็ตามความสัมพันธ์ไม่ทำงานทั้งสองวิธี สามารถมีเคียวรีที่เทียบเท่าได้ 2 เหตุผลซึ่งมีแผนการดำเนินการแตกต่างกัน
BuahahaXD

1
@BuahahaXD: นั่นไม่เป็นความจริง select * from foo where id = 4จะมีแผนการดำเนินการเหมือนกับselect * from foo where id = 2
a_horse_with_no_name

@a_horse_with_no_name ฉันทดสอบบน SQL Server และมีไฟล์ XML ที่แตกต่างกัน 2 ไฟล์ พารามิเตอร์ถูกรวมเป็นโหนด <ParameterList> ในไฟล์ XML สายตาแผนเหล่านี้เหมือนกัน (สแกนตาราง + เลือก) แต่ฉันเชื่อว่าคุณอาจถูกต้องเกี่ยวกับการเปรียบเทียบแผนการดำเนินการ
BuahahaXD

1
@a_horse_with_no_name ถูกต้องเมื่อพูดถึงคีย์ที่ไม่ซ้ำกัน สำหรับคนอื่น ๆ เป็นไปได้select * from foo where id = 4และselect * from foo where id = 2มีแผนปฏิบัติการที่แตกต่างกันสองแบบหาก 1) สถิติดัชนีไม่ทันสมัยและ 2) แม้ว่าสถิติดัชนีจะทันสมัยการแจกแจงคีย์ของ id จะไม่สมดุลกัน (รหัสที่ระบุไม่ใช่รหัสที่ไม่ซ้ำกัน)
RolandoMySQLDBA

คำตอบ:


6

ความเท่าเทียมกันทางคณิตศาสตร์ของคำสั่ง SQL สองคำคืออะไร? สำหรับฉันสองข้อความค้นหาจะเท่ากันถ้าเมื่อได้รับทั้งชุดข้อมูลเดียวกันพวกเขากลับชุดผลลัพธ์เดียวกัน

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

ภายใต้เงื่อนไขเหล่านั้นอาจเป็นไปไม่ได้

อย่างไรก็ตาม ...

... อาจเป็นไปได้หากคำค้นหาสองคำที่คุณต้องการเปรียบเทียบเป็นการดำเนินการที่เข้มงวด ถ้าเป็นเช่นนั้นคุณสามารถแปลงคิวรีให้เป็นพีชคณิตเชิงสัมพันธ์แล้วคำนวณตามกฎความเท่าเทียมกัน หากคุณมีตัวเลือก / ข้อ จำกัด ที่มีเงื่อนไขบูลีนที่ไม่น่าสนใจคุณอาจต้องพิสูจน์ว่าเงื่อนไขเหล่านั้นเทียบเท่า จากนั้นคุณจะต้องพึ่งพาพีชคณิตบูลีนและคุณอาจจะจบลงด้วยการทำตารางความจริง

อย่างที่คุณเห็นสิ่งนี้จะเป็นงานจำนวนมากและเท่าที่ฉันรู้ไม่มีอะไรที่จะคำนวณได้ทั้งหมดโดยอัตโนมัติ อย่างไรก็ตามฉันพบเครื่องมือบางอย่างที่คุณอาจพบว่ามีประโยชน์หากคุณต้องการจัดการงาน:


คำถามของฉันเกี่ยวกับการตั้งค่าเท่านั้น ฉันอัพเดทคำถาม มันเกี่ยวข้องกับปัญหา "เป็นสองอัลกอริทึมเทียบเท่า" แต่บริบทนั้น จำกัด เฉพาะการดำเนินการพื้นฐานของชุดรวมตัวเลือกย่อยเท่านั้นที่อยู่ในขอบเขตของฉัน
guettli

3

มันเป็นไปไม่ได้ที่จะตรวจสอบความหมายเชิงความหมายในเวลา จำกัด โดยนิยามดูที่ทฤษฎีบทของข้าว :

สำหรับคุณสมบัติที่ไม่สำคัญของฟังก์ชันบางส่วนไม่มีวิธีการทั่วไปและมีประสิทธิภาพในการตัดสินใจว่าอัลกอริทึมคำนวณฟังก์ชันบางส่วนกับคุณสมบัตินั้นหรือไม่


2
นี่เป็นเพียงไม่แสดงความคิดเห็น คุณช่วยขยายความสามารถในการใช้ข้าวสู่บริบทนี้ได้ไหม
Michael Green

แม้ว่ามันจะเป็นไปได้ในทางทฤษฎีไวยากรณ์มาตรฐาน SQL ในปัจจุบันจึงเป็นแบบบาร็อคมันจะเป็นไปไม่ได้ในทางปฏิบัติ
James Anderson

1
ด้วยคำอธิบาย OP ดูเหมือนว่าคำถามนั้นเกี่ยวกับการเทียบเท่าเชิงตรรกะมากกว่าความหมายเชิง semantical คำถามที่แท้จริงคือ: เราสามารถแปลงคำสั่ง SQL เป็นนิพจน์ทางคณิตศาสตร์แล้วประเมินความเท่าเทียมเชิงตรรกะได้หรือไม่?
ForguesR

2

ผู้ใช้ dba Lennart ชี้ให้ฉันเห็นโครงการนี้:

http://cosette.cs.washington.edu/

Cosette เป็นผู้ตรวจสอบอัตโนมัติสำหรับการตรวจสอบความเท่าเทียมกันของแบบสอบถาม SQL มันทำให้ชิ้นส่วน SQL จำนวนมากใน Coq Proof Assistant และเครื่องเสมือนสัญลักษณ์ Rosette เป็นทางการ มันจะส่งกลับทั้งการพิสูจน์อย่างเป็นทางการของการเทียบเท่าหรือ counterexample สำหรับคู่ของแบบสอบถามที่กำหนด


1

วิธีหนึ่งที่จะทำได้คือสร้าง parser หรือดีกว่าใช้ที่มีอยู่ ฉันเชื่อว่า C # มีคลาส TSQLParser และมีวิธีการแยกวิเคราะห์ () ตัวแยกวิเคราะห์จะแบ่งการสืบค้นของคุณเป็นคลาสย่อยซึ่งคุณสามารถเปรียบเทียบได้


1

หากคุณกำลังมองหาการทดสอบความเท่าเทียมตามทฤษฎีตั้งค่าวิธีที่ดีที่สุดของคุณคือการแปลงWHEREเงื่อนไขใด ๆที่สามารถแปลงเป็นประเภทของJOIN(ภายในหรือภายนอก) และมีคำสั่ง refactored ซึ่งรวมถึงการIN subselectและEXISTS subselectและเงื่อนไขอื่น ๆ ในประโยคที่มีคำว่าWHERE SELECTหากคุณทำสิ่งนี้กับทั้งสองคำสั่ง SQL คุณจะมีFROMประโยคใหม่ซึ่งแสดงถึงตรรกะ / คณิตศาสตร์แบบ set-based ที่คุณสนใจจากนั้นคุณก็สามารถเปรียบเทียบทั้งสองประโยคได้อย่างง่ายดาย หากคุณกำลังมองหาวิธีการทำสิ่งนี้โดยอัตโนมัติฉันไม่รู้เครื่องมือที่สามารถทำสิ่งนี้ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.