যোগদানের মধ্য থেকে প্রথম সারিটি কীভাবে নির্বাচন করবেন যা প্রাথমিক কীতে একাধিক সারি দেয়


15

এটি এই প্রশ্নের সাথে সম্পর্কিত: একাধিক সারণীতে যোগদানের ফলে নকল সারিগুলির ফলাফল

আমার দুটি টেবিল রয়েছে যা আমি যোগ দিচ্ছি। তারা একটি চাবি ভাগ। ব্যক্তি টেবিলে প্রাথমিক কী প্রতি এক নাম থাকে তবে ইমেল টেবিলটিতে ব্যক্তি প্রতি আইডি একাধিক ইমেল থাকে। আমি প্রতি ব্যক্তি হিসাবে কেবল প্রথম ইমেলটি দেখাতে চাই। বর্তমানে আমি প্রতি ব্যক্তি একাধিক সারি পেয়েছি কারণ তাদের একাধিক ইমেল রয়েছে। আমি এসকিউএল-সার্ভার 2005 চালাচ্ছি।

সম্পাদনা: এটি টি-এসকিউএল। প্রথম ইমেল আক্ষরিক অর্থে ব্যক্তি প্রতি প্রথম ইমেল সারি।

সম্পাদনা 2: প্রথম ইমেলটি যেমন দেখছি এটি হবে প্রথম ইমেল সারি যা এসকিউএল কোয়েরির মাধ্যমে কাজ করার সাথে যুক্ত হতে দেখায়। কোন ইমেলটি প্রদর্শিত হবে তা আমি বিবেচনা করি না। কেবলমাত্র একের বেশি ইমেল প্রদর্শিত হবে না। আমি আশা করি এটি পরিষ্কার হয়ে যায়।

Table1: Person
Table2: Email

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

3
"প্রথম" ইমেল বলতে কী বোঝ? কোন ধরণের মানদণ্ড "প্রথম" নির্ধারণ করে?
কুই মান

1
আপনি কি শীর্ষ 1 চেষ্টা করেছিলেন?
রেসার এসকিউএল

3
আপনি কোন ডিবিএমএস ব্যবহার করছেন? Postgres? ওরাকল?
a_horse_with_no_name

3
"ব্যক্তির প্রতি প্রথম ই-মেইল সারি" সত্যিই আমাদের কিছু বলতে হয় না। "প্রথম" কোন মানদণ্ডে? এসকিউএল টেবিলগুলির কোনও সহজাত অর্ডার নেই।
ypercubeᵀᴹ

5
হ্যাঁ, এটি একটি বৈধ মানদণ্ড: "কোন সারিটি কেবলমাত্র আমি তার যত্ন নিই না"।
ypercubeᵀᴹ

উত্তর:


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
'এ' কী? এটি কি টেবিলের নামটির সংক্ষেপণ?
নর্মানড্যানজিগ

2
@normandantzig এটা একটা ব্যাপার ওরফে
বেকন বিট

1
১) আপনি কি আমার উভয় টেবিলের নাম দিয়েছিলেন (পার্সন.প্রেসননাম, ইমেল.ইমেল, ROW_NUMBER () ব্যক্তির (পার্টিশনের পক্ষ থেকে.ইমেলের মাধ্যমে পার্টিশন। ইমেল.ইমেল দ্বারা অংশ) AS বাম দিক থেকে ব্যক্তি বাম থেকে পার্সোন.আইডি = এ যোগদান করুন ইমেল.পারসনআইডি) এ এবং ২) যাতে আপনি উভয় কলামকে টেবিল হিসাবে ব্যবহার করে উল্লেখ করতে পারেন?
নর্মানডানজিগ

4
প্রথম বন্ধনের ভিতরে যা থাকে তাকে ডেরিভড টেবিল বলে । এটি কেবল একটি বেস টেবিলের মতো একটি বৈধ সারণী তবে এর জীবদ্দশায় কেবল ক্যোয়ারি কার্যকর করার সময়কালের জন্য। এটির একটি নাম (বা উপনাম) থাকতে হবে এবং @ সাবিন এটির নামটি বেছে নিতে বেছে নিয়েছে A। এই টেবিলটিতে 3 টি কলাম রয়েছে (পার্সোননাম, ইমেল, আরএন) এবং প্রথম বন্ধনীগুলির বাইরে, আপনি নিজের কোডের অন্যান্য টেবিলের জন্য A.Emailযেমন ব্যবহার করতে পারেন তেমন ব্যবহার করতে পারেন tablename.columnname
ypercubeᵀᴹ

13

আমি এটির জন্য একটি বাইরের প্রয়োগ ব্যবহার করব, আমি এটি আরও পাঠযোগ্য find

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

কোন ইমেলটি প্রদর্শিত হবে তা বিবেচ্য নয়। আমি মনে করি যে নিম্নলিখিতটি খুব সরাসরি is

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
'পি' কী? এটি কি টেবিলের নামটির সংক্ষেপণ?
নর্মানড্যানজিগ

1
'পি' ব্যক্তির জন্য একটি উপনাম। এটি FROM ধারাতে সারণী ঘোষণার অনুসরণ করে।
কুই মান

1
@ নরমনড্যান্টজিগ উভয়ই বেশিরভাগ পরিস্থিতিতে এসকিউএল সার্ভারে বৈধ।
বেকন বিট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.