पहली पंक्ति से पहली पंक्ति का चयन कैसे करें जो प्राथमिक कुंजी पर कई पंक्तियों को लौटाता है


15

यह इस सवाल से संबंधित है: डुप्लिकेट पंक्तियों में कई तालिकाओं के परिणाम में शामिल होना

मेरे पास दो टेबल हैं जो मैं शामिल हो रहा हूं। वे एक कुंजी साझा करते हैं। व्यक्ति तालिका में प्रति प्राथमिक कुंजी में एक नाम है, लेकिन ईमेल तालिका में प्रति व्यक्ति कई ईमेल हैं। मैं प्रति व्यक्ति केवल पहला ईमेल दिखाना चाहता हूं। वर्तमान में मुझे प्रति व्यक्ति कई पंक्तियाँ मिलती हैं क्योंकि उनके पास कई ईमेल हैं। मैं SQL-Server 2005 चला रहा हूं।

संपादित करें: यह टी-एसक्यूएल है। पहला ईमेल वस्तुतः प्रति व्यक्ति पहली ईमेल पंक्ति है।

संपादित करें 2: पहला ईमेल जैसा कि मैं देख रहा हूं यह पहली ईमेल पंक्ति होगी जो क्वेरी के माध्यम से एसक्यूएल के काम में शामिल होने के लिए दिखाई देती है। मुझे कोई फर्क नहीं पड़ता कि कौन सा ईमेल दिखाता है। केवल इतना ही नहीं एक से अधिक ईमेल दिखाता है। मुझे उम्मीद है कि यह स्पष्ट हो जाता है।

Table1: Person
Table2: Email

Select Person.PersonName, Email.Email
From person 
left join on Person.ID=Email.PersonId;

3
"प्रथम" ईमेल से आपका क्या अभिप्राय है? किस प्रकार के मानदंड "पहले" निर्धारित करते हैं?
कतार मान

1
क्या आपने शीर्ष 1 की कोशिश की?
रेसर एसक्यूएल

3
आप कौन से DBMS का उपयोग कर रहे हैं? Postgres? आकाशवाणी?
a_horse_with_no_name

3
"प्रति व्यक्ति पहले ईमेल पंक्ति" वास्तव में हमें कुछ भी नहीं बताता है। "पहले" किस मापदंड से? SQL टेबल में कोई अंतर्निहित आदेश नहीं है।
ypercube y

5
खैर, यह एक मान्य मानदंड है: "मुझे परवाह नहीं है कि कौन सी पंक्ति, बस एक"।
ypercube y

जवाबों:


18
SELECT
    A.PersonName, A.Email
FROM
        (
        Select Person.PersonName, Email.Email
            ,ROW_NUMBER() OVER(PARTITION BY Person.ID ORDER BY Email.Email) AS RN
        From person 
        left join Email on Person.ID=Email.PersonId
        ) A
WHERE A.RN = 1

1
'ए' क्या है? क्या यह तालिका के नाम का संक्षिप्त नाम है?
normandantzig

2
@normandantzig यह एक उपनाम है
बेकन बिट्स

1
1.) क्या आपने से (Select Person.PersonName, Email.Email, ROW_NUMBER () OVER (PARTITION BY Person.ID ORDER BY Email.Email) का उपयोग करके मेरी दोनों सारणियों को अन्य व्यक्ति के रूप में इस्तेमाल किया है। Email.PersonId) A और 2.) ताकि आप तालिका के रूप में A का उपयोग करके दोनों स्तंभों का उल्लेख कर सकें?
normandantzig

4
कोष्ठक के अंदर क्या है इसे व्युत्पन्न तालिका कहा जाता है । यह एक मान्य तालिका है, बस आधार तालिका के रूप में, लेकिन यह आजीवन केवल क्वेरी निष्पादन की अवधि के लिए है। इसका एक नाम (या उपनाम) होना चाहिए और @sabin ने इसका नाम चुना A। इस तालिका में 3 कॉलम हैं (PersonName, Email, RN) और कोष्ठक के बाहर, आप A.Emailउसी तरह उपयोग कर सकते हैं जैसे आप tablename.columnnameअपने कोड की हर दूसरी तालिका के लिए उपयोग कर सकते हैं ।
ypercube y

13

मैं इसके लिए एक बाहरी आवेदन का उपयोग करूंगा, मुझे यह अधिक पठनीय लगता है।

Select Person.PersonName, coalesce(Email.Email,'No email found.') as Email
From person 
outer apply (
  select top(1) Email.Email 
  from Email 
  where Person.ID=Email.PersonId
  order by <whatever suits you>
) as Email;

5

जैसा कि यह कोई फर्क नहीं पड़ता कि कौन सा ईमेल दिखाता है। मुझे लगता है कि निम्नलिखित एक बहुत ही प्रत्यक्ष है।

Select Person.PersonName,  MIN(Email.Email)
From person 
left join email 
on Person.ID=Email.PersonId
group by Person.Id, Person.PersonName

3
select
  P.PersonID,
  (SELECT TOP 1 E.Email FROM Email E WHERE E.PersonID = P.PersonID ORDER BY <pick your column here>)
from
  Person P

1
'P ’क्या है। क्या यह तालिका के नाम का संक्षिप्त नाम है?
normandantzig

1
'P' व्यक्ति के लिए एक उपनाम है। यह FROM क्लॉज में तालिका की घोषणा के बाद है।
राऊत मान

1
@normandantzig अधिकांश स्थितियों में दोनों SQL सर्वर में मान्य हैं।
बेकन बिट्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.