2010-04-08 14 views
9

को देखते हुए निम्न उदाहरण डेटा:एसक्यूएल केवल अधिकतम पंक्ति पहेली में शामिल हों

Users 
+--------------------------------------------------+ 
| ID | First Name | Last Name | Network Identifier | 
+--------------------------------------------------+ 
| 1 | Billy  | O'Neal | bro4    | 
+----+------------+-----------+--------------------+ 
| 2 | John  | Skeet  | jsk1    | 
+----+------------+-----------+--------------------+ 

Hardware 
+----+-------------------+---------------+ 
| ID | Hardware Name  | Serial Number | 
+----------------------------------------+ 
| 1 | Latitude E6500 | 5555555  | 
+----+-------------------+---------------+ 
| 2 | Latitude E6200 | 2222222  | 
+----+-------------------+---------------+ 

HardwareAssignments 
+---------+-------------+-------------+ 
| User ID | Hardware ID | Assigned On | 
+-------------------------------------+ 
| 1  | 1   | April 1  | 
+---------+-------------+-------------+ 
| 1  | 2   | April 10 | 
+---------+-------------+-------------+ 
| 2  | 2   | April 1  | 
+---------+-------------+-------------+ 
| 2  | 1   | April 11 | 
+---------+-------------+-------------+ 

मैं एक SQL क्वेरी जो निम्न परिणाम देना होगा लिखने के लिए करना चाहते हैं:

+--------------------+------------+-----------+----------------+---------------+-------------+ 
| Network Identifier | First Name | Last Name | Hardware Name | Serial Number | Assigned On | 
+--------------------------------------------------------------------------------------------+ 
| bro4    | Billy  | O'Neal | Latitude E6200 | 2222222  | April 10 | 
+--------------------+------------+-----------+----------------+---------------+-------------+ 
| jsk1    | John  | Skeet  | Latitude E6500 | 5555555  | April 11 | 
+--------------------+------------+-----------+----------------+---------------+-------------+ 

मेरे मुसीबत है कि प्रत्येक उपयोगकर्ता के लिए अधिकतम "असाइन किए गए" दिनांक को प्रत्येक उपयोगकर्ता के लिए चुना जाना चाहिए और वास्तविक जुड़ने के लिए उपयोग किया जाना चाहिए ...

क्या SQL में यह एक चालाक तरीका है?

+2

तो क्या आपको जॉन स्कीट का पुराना लैपटॉप मिल गया है? Kewl! – APC

+1

@ एएपीसी: हाँ! कंपनी ने सोचा कि वह स्टैक ओवरफ्लो पर बहुत अधिक समय बिता रहा है ... :) –

उत्तर

9
SELECT U.NetworkIdentifier, U.FirstName, U.LastName, 
     H.HardwareName, H.SerialNumber 
    FROM (SELECT UserID, MAX(AssignedOn) LastAssignment 
      FROM HardwareAssignments 
     GROUP BY UserID) AS T 
    JOIN HardwareAssignments AS HA 
     ON HA.UserId = T.UserID AND HA.AssignedOn = T.LastAssignment 
    JOIN Users AS U ON U.ID = HA.UserID 
    JOIN Hardware AS H ON H.ID = HA.HardwareID 
ORDER BY U.NetworkIdentifier; 

इस और जस्टिन निसनेर के उत्तर के बीच का अंतर यह है कि उप-क्वेरी प्रकट होती है; यहां, मैंने इसे खंड से बनाया है। यह बहुत गारंटी देता है कि इसे एक बार निष्पादित किया जाता है। जब जस्टिन के जवाब में WHERE क्लॉज में एक सहसंबंधित उप-क्वेरी होती है, तो यह संभव है कि ऑप्टिमाइज़र प्रत्येक पंक्ति के लिए उप-क्वेरी निष्पादित करेगा - जो टेबल अधिक होने पर अधिक महंगा होता है। वास्तव में एक अच्छा अनुकूलक चीजों को फटकार सकता है ताकि दोनों समकक्ष हों।

+0

+1 यदि ओपी इस संस्करण को काम करने में सक्षम है, तो यह मेरे पोस्ट से अधिक बेहतर प्रदर्शन करेगा (बड़े डेटा सेट के लिए ... और जब तक क्वेरी ऑप्टिमाइज़र इस तरह से काम करने के लिए मेरी क्वेरी को फ़्लैट नहीं करता है)। –

+0

@ जस्टिंग नीसनेर: उपर्युक्त टिप्पणी के आधार पर इस पर स्वीकृत उत्तर हटा दिया गया। कृपया इसे व्यक्तिगत रूप से न लें :) –

+0

+1 इस संक्षिप्त, भारी लाभ का परीक्षण किया। हालांकि यह ध्यान दिया जाना चाहिए कि बाहरी क्वेरी में उच्च चयनकता है और तालिकाओं बहुत बड़ी हैं (हालांकि तब आंतरिक क्वेरी पर चयन मानदंड दोहराकर उपर्युक्त क्वेरी को बेहतर बनाना आसान है)। – Unreason

8
select * from Users as u 
inner join HardwareAssignments as ha 
    on u.id = ha.userid 
inner join Hardware as h 
    on uh.hardwareid = h.id 
where ha.AssignedOn = (select max(assignedon) 
         from HardwareAssignments as ha2 
         where ha.userid = ha2.userid) 

जो आपको बंद कर सकता है। सुनिश्चित नहीं है कि यह सही है या नहीं।

+0

+1 मुझे इसे मारो :) – Unreason

+0

अपनी आवश्यकताओं के लिए कॉलम समायोजित करें, लेकिन समाधान का मुख्य भाग उप क्वेरी है। –

+0

दोह! * बिल अब थोड़ा गूंगा लगता है –

0

शामिल होने के परिणामों को फ़िल्टर करने के लिए समूह द्वारा अधिकतम और अधिकतम उपयोग करें।

+0

जो केवल एक पंक्ति देता है। मुझे प्रति उपयोगकर्ता एक पंक्ति की आवश्यकता है। –

संबंधित मुद्दे