एक बार एक ब्लॉग पर एक सहकर्मी ने एक तस्वीर पोस्ट की:
ओरेकल एसक्यूएल पर आठ क्वींस की समस्या के लेख को याद करते हुए, मैंने इसे इसी तरह से हल करने की कोशिश करने का फैसला किया।
सबसे पहले, मैं सभी संभावित उत्तरों के मूल कार्टेशियन उत्पाद का वर्णन करता हूं:
(select level a from dual connect by level <= 5) q1, (select level a from dual connect by level <= 5) q2, (select level a from dual connect by level <= 5) q3, (select level a from dual connect by level <= 5) q4, (select level a from dual connect by level <= 5) q5, (select level a from dual connect by level <= 5) q6, (select level a from dual connect by level <= 5) q7, (select level a from dual connect by level <= 5) q8, (select level a from dual connect by level <= 5) q9, (select level a from dual connect by level <= 5) q10, (select level a from dual connect by level <= 5) q11, (select level a from dual connect by level <= 5) q12, (select level a from dual connect by level <= 5) q13, (select level a from dual connect by level <= 5) q14, (select level a from dual connect by level <= 5) q15, (select level a from dual connect by level <= 5) q16, (select level a from dual connect by level <= 5) q17, (select level a from dual connect by level <= 5) q18, (select level a from dual connect by level <= 5) q19, (select level a from dual connect by level <= 5) q20
फिर, सुविधा के लिए, मैं संख्या a1..a20 द्वारा उत्तरों का नाम बदल देता हूं और कुछ स्थितियों के लिए आवश्यक उत्तर विकल्पों की संख्या को गिनता हूं - उत्तर की संख्या "ए" (1), उत्तर की संख्या "बी" पहले से दसवें सवाल तक, जवाब की संख्या "बी" कुल में। और इतने पर:
select q1.a a1, q2.a a2, q3.a a3, q4.a a4, q5.a a5, q6.a a6, q7.a a7, q8.a a8, q9.a a9, q10.a a10, q11.a a11, q12.a a12, q13.a a13, q14.a a14, q15.a a15, q16.a a16, q17.a a17, q18.a a18, q19.a a19, q20.a a20, case q1.a when 1 then 1 else 0 end + case q2.a when 1 then 1 else 0 end + case q3.a when 1 then 1 else 0 end + case q4.a when 1 then 1 else 0 end + case q5.a when 1 then 1 else 0 end + case q6.a when 1 then 1 else 0 end + case q7.a when 1 then 1 else 0 end + case q8.a when 1 then 1 else 0 end + case q9.a when 1 then 1 else 0 end + case q10.a when 1 then 1 else 0 end + case q11.a when 1 then 1 else 0 end + case q12.a when 1 then 1 else 0 end + case q13.a when 1 then 1 else 0 end + case q14.a when 1 then 1 else 0 end + case q15.a when 1 then 1 else 0 end + case q16.a when 1 then 1 else 0 end + case q17.a when 1 then 1 else 0 end + case q18.a when 1 then 1 else 0 end + case q19.a when 1 then 1 else 0 end + case q20.a when 1 then 1 else 0 end a_count, case q1.a when 2 then 1 else 0 end + case q2.a when 2 then 1 else 0 end + case q3.a when 2 then 1 else 0 end + case q4.a when 2 then 1 else 0 end + case q5.a when 2 then 1 else 0 end + case q6.a when 2 then 1 else 0 end + case q7.a when 2 then 1 else 0 end + case q8.a when 2 then 1 else 0 end + case q9.a when 2 then 1 else 0 end + case q10.a when 2 then 1 else 0 end b_count10, case q1.a when 2 then 1 else 0 end + case q2.a when 2 then 1 else 0 end + case q3.a when 2 then 1 else 0 end + case q4.a when 2 then 1 else 0 end + case q5.a when 2 then 1 else 0 end + case q6.a when 2 then 1 else 0 end + case q7.a when 2 then 1 else 0 end + case q8.a when 2 then 1 else 0 end + case q9.a when 2 then 1 else 0 end + case q10.a when 2 then 1 else 0 end + case q11.a when 2 then 1 else 0 end + case q12.a when 2 then 1 else 0 end + case q13.a when 2 then 1 else 0 end + case q14.a when 2 then 1 else 0 end + case q15.a when 2 then 1 else 0 end + case q16.a when 2 then 1 else 0 end + case q17.a when 2 then 1 else 0 end + case q18.a when 2 then 1 else 0 end + case q19.a when 2 then 1 else 0 end + case q20.a when 2 then 1 else 0 end b_count, case q1.a when 3 then 1 else 0 end + case q2.a when 3 then 1 else 0 end + case q3.a when 3 then 1 else 0 end + case q4.a when 3 then 1 else 0 end + case q5.a when 3 then 1 else 0 end + case q6.a when 3 then 1 else 0 end + case q7.a when 3 then 1 else 0 end + case q8.a when 3 then 1 else 0 end + case q9.a when 3 then 1 else 0 end + case q10.a when 3 then 1 else 0 end + case q11.a when 3 then 1 else 0 end + case q12.a when 3 then 1 else 0 end + case q13.a when 3 then 1 else 0 end + case q14.a when 3 then 1 else 0 end + case q15.a when 3 then 1 else 0 end + case q16.a when 3 then 1 else 0 end + case q17.a when 3 then 1 else 0 end + case q18.a when 3 then 1 else 0 end + case q19.a when 3 then 1 else 0 end + case q20.a when 3 then 1 else 0 end c_count, case q1.a when 4 then 1 else 0 end + case q2.a when 4 then 1 else 0 end + case q3.a when 4 then 1 else 0 end + case q4.a when 4 then 1 else 0 end + case q5.a when 4 then 1 else 0 end + case q6.a when 4 then 1 else 0 end + case q7.a when 4 then 1 else 0 end + case q8.a when 4 then 1 else 0 end + case q9.a when 4 then 1 else 0 end + case q10.a when 4 then 1 else 0 end + case q11.a when 4 then 1 else 0 end + case q12.a when 4 then 1 else 0 end + case q13.a when 4 then 1 else 0 end + case q14.a when 4 then 1 else 0 end + case q15.a when 4 then 1 else 0 end + case q16.a when 4 then 1 else 0 end + case q17.a when 4 then 1 else 0 end + case q18.a when 4 then 1 else 0 end + case q19.a when 4 then 1 else 0 end + case q20.a when 4 then 1 else 0 end d_count, case q1.a when 5 then 1 else 0 end + case q2.a when 5 then 1 else 0 end + case q3.a when 5 then 1 else 0 end + case q4.a when 5 then 1 else 0 end + case q5.a when 5 then 1 else 0 end + case q6.a when 5 then 1 else 0 end + case q7.a when 5 then 1 else 0 end + case q8.a when 5 then 1 else 0 end + case q9.a when 5 then 1 else 0 end + case q10.a when 5 then 1 else 0 end + case q11.a when 5 then 1 else 0 end + case q12.a when 5 then 1 else 0 end + case q13.a when 5 then 1 else 0 end + case q14.a when 5 then 1 else 0 end + case q15.a when 5 then 1 else 0 end + case q16.a when 5 then 1 else 0 end + case q17.a when 5 then 1 else 0 end + case q18.a when 5 then 1 else 0 end + case q19.a when 5 then 1 else 0 end + case q20.a when 5 then 1 else 0 end e_count from (select level a from dual connect by level <= 5) q1, (select level a from dual connect by level <= 5) q2, (select level a from dual connect by level <= 5) q3, (select level a from dual connect by level <= 5) q4, (select level a from dual connect by level <= 5) q5, (select level a from dual connect by level <= 5) q6, (select level a from dual connect by level <= 5) q7, (select level a from dual connect by level <= 5) q8, (select level a from dual connect by level <= 5) q9, (select level a from dual connect by level <= 5) q10, (select level a from dual connect by level <= 5) q11, (select level a from dual connect by level <= 5) q12, (select level a from dual connect by level <= 5) q13, (select level a from dual connect by level <= 5) q14, (select level a from dual connect by level <= 5) q15, (select level a from dual connect by level <= 5) q16, (select level a from dual connect by level <= 5) q17, (select level a from dual connect by level <= 5) q18, (select level a from dual connect by level <= 5) q19, (select level a from dual connect by level <= 5) q20
और अंत में, मैं सभी शर्तों को लागू करता हूं और परिणाम प्रिंट करता हूं:
select a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20 from (select q1.a a1, q2.a a2, q3.a a3, q4.a a4, q5.a a5, q6.a a6, q7.a a7, q8.a a8, q9.a a9, q10.a a10, q11.a a11, q12.a a12, q13.a a13, q14.a a14, q15.a a15, q16.a a16, q17.a a17, q18.a a18, q19.a a19, q20.a a20, case q1.a when 1 then 1 else 0 end + case q2.a when 1 then 1 else 0 end + case q3.a when 1 then 1 else 0 end + case q4.a when 1 then 1 else 0 end + case q5.a when 1 then 1 else 0 end + case q6.a when 1 then 1 else 0 end + case q7.a when 1 then 1 else 0 end + case q8.a when 1 then 1 else 0 end + case q9.a when 1 then 1 else 0 end + case q10.a when 1 then 1 else 0 end + case q11.a when 1 then 1 else 0 end + case q12.a when 1 then 1 else 0 end + case q13.a when 1 then 1 else 0 end + case q14.a when 1 then 1 else 0 end + case q15.a when 1 then 1 else 0 end + case q16.a when 1 then 1 else 0 end + case q17.a when 1 then 1 else 0 end + case q18.a when 1 then 1 else 0 end + case q19.a when 1 then 1 else 0 end + case q20.a when 1 then 1 else 0 end a_count, case q1.a when 2 then 1 else 0 end + case q2.a when 2 then 1 else 0 end + case q3.a when 2 then 1 else 0 end + case q4.a when 2 then 1 else 0 end + case q5.a when 2 then 1 else 0 end + case q6.a when 2 then 1 else 0 end + case q7.a when 2 then 1 else 0 end + case q8.a when 2 then 1 else 0 end + case q9.a when 2 then 1 else 0 end + case q10.a when 2 then 1 else 0 end b_count10, case q1.a when 2 then 1 else 0 end + case q2.a when 2 then 1 else 0 end + case q3.a when 2 then 1 else 0 end + case q4.a when 2 then 1 else 0 end + case q5.a when 2 then 1 else 0 end + case q6.a when 2 then 1 else 0 end + case q7.a when 2 then 1 else 0 end + case q8.a when 2 then 1 else 0 end + case q9.a when 2 then 1 else 0 end + case q10.a when 2 then 1 else 0 end + case q11.a when 2 then 1 else 0 end + case q12.a when 2 then 1 else 0 end + case q13.a when 2 then 1 else 0 end + case q14.a when 2 then 1 else 0 end + case q15.a when 2 then 1 else 0 end + case q16.a when 2 then 1 else 0 end + case q17.a when 2 then 1 else 0 end + case q18.a when 2 then 1 else 0 end + case q19.a when 2 then 1 else 0 end + case q20.a when 2 then 1 else 0 end b_count, case q1.a when 3 then 1 else 0 end + case q2.a when 3 then 1 else 0 end + case q3.a when 3 then 1 else 0 end + case q4.a when 3 then 1 else 0 end + case q5.a when 3 then 1 else 0 end + case q6.a when 3 then 1 else 0 end + case q7.a when 3 then 1 else 0 end + case q8.a when 3 then 1 else 0 end + case q9.a when 3 then 1 else 0 end + case q10.a when 3 then 1 else 0 end + case q11.a when 3 then 1 else 0 end + case q12.a when 3 then 1 else 0 end + case q13.a when 3 then 1 else 0 end + case q14.a when 3 then 1 else 0 end + case q15.a when 3 then 1 else 0 end + case q16.a when 3 then 1 else 0 end + case q17.a when 3 then 1 else 0 end + case q18.a when 3 then 1 else 0 end + case q19.a when 3 then 1 else 0 end + case q20.a when 3 then 1 else 0 end c_count, case q1.a when 4 then 1 else 0 end + case q2.a when 4 then 1 else 0 end + case q3.a when 4 then 1 else 0 end + case q4.a when 4 then 1 else 0 end + case q5.a when 4 then 1 else 0 end + case q6.a when 4 then 1 else 0 end + case q7.a when 4 then 1 else 0 end + case q8.a when 4 then 1 else 0 end + case q9.a when 4 then 1 else 0 end + case q10.a when 4 then 1 else 0 end + case q11.a when 4 then 1 else 0 end + case q12.a when 4 then 1 else 0 end + case q13.a when 4 then 1 else 0 end + case q14.a when 4 then 1 else 0 end + case q15.a when 4 then 1 else 0 end + case q16.a when 4 then 1 else 0 end + case q17.a when 4 then 1 else 0 end + case q18.a when 4 then 1 else 0 end + case q19.a when 4 then 1 else 0 end + case q20.a when 4 then 1 else 0 end d_count, case q1.a when 5 then 1 else 0 end + case q2.a when 5 then 1 else 0 end + case q3.a when 5 then 1 else 0 end + case q4.a when 5 then 1 else 0 end + case q5.a when 5 then 1 else 0 end + case q6.a when 5 then 1 else 0 end + case q7.a when 5 then 1 else 0 end + case q8.a when 5 then 1 else 0 end + case q9.a when 5 then 1 else 0 end + case q10.a when 5 then 1 else 0 end + case q11.a when 5 then 1 else 0 end + case q12.a when 5 then 1 else 0 end + case q13.a when 5 then 1 else 0 end + case q14.a when 5 then 1 else 0 end + case q15.a when 5 then 1 else 0 end + case q16.a when 5 then 1 else 0 end + case q17.a when 5 then 1 else 0 end + case q18.a when 5 then 1 else 0 end + case q19.a when 5 then 1 else 0 end + case q20.a when 5 then 1 else 0 end e_count from (select level a from dual connect by level <= 5) q1, (select level a from dual connect by level <= 5) q2, (select level a from dual connect by level <= 5) q3, (select level a from dual connect by level <= 5) q4, (select level a from dual connect by level <= 5) q5, (select level a from dual connect by level <= 5) q6, (select level a from dual connect by level <= 5) q7, (select level a from dual connect by level <= 5) q8, (select level a from dual connect by level <= 5) q9, (select level a from dual connect by level <= 5) q10, (select level a from dual connect by level <= 5) q11, (select level a from dual connect by level <= 5) q12, (select level a from dual connect by level <= 5) q13, (select level a from dual connect by level <= 5) q14, (select level a from dual connect by level <= 5) q15, (select level a from dual connect by level <= 5) q16, (select level a from dual connect by level <= 5) q17, (select level a from dual connect by level <= 5) q18, (select level a from dual connect by level <= 5) q19, (select level a from dual connect by level <= 5) q20) where
प्रश्न 19 पर शर्तों को लागू करना आवश्यक नहीं है, लेकिन 20 पर मैंने हिम्मत नहीं की, क्योंकि सवाल कुछ दार्शनिक है। परिणाम चार संभावित उत्तर हैं:
ए 1 | ए 2 | ए 3 | ए 4 | A5 | ए 6 | ए 7 | ए 8 | ए 9 | A10 | A11 | A12 | ए 13 | ए 14 | A15 | A16 | A17 | A18 | A19 | A20 |
---|
4 | 1 | 4 | 2 | 5 | 4 | 4 | 5 | 4 | 1 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 | 2 | 5 |
4 | 1 | 4 | 2 | 5 | 4 | 4 | 5 | 4 | 1 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 | 5 | 2 |
4 | 1 | 4 | 2 | 5 | 4 | 4 | 5 | 4 | 1 | 2 | 1 | 4 | 3 | 1 | 4 | 2 | 5 | 4 | 1 |
4 | 1 | 4 | 2 | 5 | 4 | 4 | 5 | 4 | 1 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 5 | 3 | 1 |
यदि हम मानते हैं कि "सबसे सही" उत्तर "ई" (5) है, तो प्रश्न 20 है, तो पहली पंक्ति पूरी समस्या का उत्तर है।
योजना के विश्लेषण और निर्माण के साथ अनुरोध को पूरा करने में 15..20 का समय लगता है। मौजूदा योजना के अनुसार बार-बार निष्पादन - लगभग 3 एस।
यदि आप क्वेरी योजना को देखते हैं, तो आप देख सकते हैं कि यह पूर्ण नहीं है (5 ^ 20 विकल्प), लेकिन अनुकूलित गणना; चूँकि चरों को उनके साथ जोड़ा जाता है, प्रतिबंधात्मक शर्तों को तुरंत उन पर लागू किया जाता है, बार-बार खोजे जा रहे विकल्पों की संख्या को सीमित करते हुए।
जैसा कि मेरे अनुभव ने दिखाया है, एसक्यूएल में इस तरह की समस्या को हल करना एक अनिवार्य भाषा की तुलना में सरल हो गया है - यह केवल कई विकल्पों पर लगाए गए प्रतिबंधों का वर्णन करने के लिए पर्याप्त था। ओरेकल ने अपने दम पर अनुकूलन का संचालन किया, और काफी सफलतापूर्वक।