सही समाधान है:
SELECT o.*
FROM `Persons` o # 'o' from 'oldest person in group'
LEFT JOIN `Persons` b # 'b' from 'bigger age'
ON o.Group = b.Group AND o.Age < b.Age
WHERE b.Age is NULL # bigger age not found
यह कैसे काम करता है:
यह o
. की प्रत्येक पंक्ति से मेल खाता है b
. की सभी पंक्तियों के साथ कॉलम Group
. में समान मान वाले और कॉलम में एक बड़ा मान Age
. o
. से कोई भी पंक्ति कॉलम Age
. में अपने समूह का अधिकतम मान नहीं होना b
. की एक या अधिक पंक्तियों से मेल खाएगा ।
LEFT JOIN
NULL
से भरी एक पंक्ति के साथ यह समूह के सबसे बुजुर्ग व्यक्ति (उनके समूह में अकेले रहने वाले व्यक्तियों सहित) से मेल खाता है b
. से s ('समूह में कोई सबसे बड़ी उम्र नहीं')।INNER JOIN
का उपयोग करना इन पंक्तियों को मेल नहीं खाता और उन्हें अनदेखा कर दिया जाता है।
WHERE
क्लॉज केवल NULL
वाली पंक्तियों को रखता है b
. से निकाले गए फ़ील्ड में s . वे प्रत्येक समूह के सबसे बुजुर्ग व्यक्ति हैं।
आगे की रीडिंग
इस समाधान और कई अन्य को पुस्तक में समझाया गया है SQL एंटीपैटर्न:डेटाबेस प्रोग्रामिंग के नुकसान से बचना