প্রতিটি সারি কীভাবে নির্বাচন করবেন যেখানে কলামের মান পৃথক নয়


154

আমার একটি নির্বাচনী বিবৃতি চালানো দরকার যা সমস্ত সারি প্রদান করে যেখানে কোনও কলামের মান পৃথক নয় (যেমন ইমেলএড্রেস)।

উদাহরণস্বরূপ, যদি টেবিলটি নীচের মত দেখাচ্ছে:

CustomerName     EmailAddress
Aaron            aaron@gmail.com
Christy          aaron@gmail.com
Jason            jason@gmail.com
Eric             eric@gmail.com
John             aaron@gmail.com

ফিরে আসতে আমার জিজ্ঞাসা দরকার:

Aaron            aaron@gmail.com
Christy          aaron@gmail.com
John             aaron@gmail.com

আমি অনেকগুলি পোস্ট পড়েছি এবং বিভিন্ন প্রশ্নের জন্য চেষ্টা করেছি কোনও লাভ হয়নি। আমার বিশ্বাস করা ক্যোয়ারীটি কাজ করা উচিত নীচে। কেউ বিকল্প প্রস্তাব দিতে পারেন বা আমার জিজ্ঞাসায় কী ভুল হতে পারে আমাকে বলতে পারেন?

select EmailAddress, CustomerName from Customers
group by EmailAddress, CustomerName
having COUNT(distinct(EmailAddress)) > 1

উত্তর:


263

এটি উপায়ের তুলনায় উল্লেখযোগ্যভাবে দ্রুত EXISTS:

SELECT [EmailAddress], [CustomerName] FROM [Customers] WHERE [EmailAddress] IN
  (SELECT [EmailAddress] FROM [Customers] GROUP BY [EmailAddress] HAVING COUNT(*) > 1)

1
আরে, আমি জানি এই উত্তরটি 7 বছরের পুরনো, তবে আপনি এখনও যদি থাকেন তবে আপনি কীভাবে এটি কাজ করে তা ব্যাখ্যা করতে আপত্তি করবেন? আমার সমস্যার সমাধানও!
লু

4
একটি ব্যবহার HAVINGএখানে পরিবর্তে একটি দ্বিতীয় SELECT...WHEREদ্বিতীয় বিকল্প পরিবর্তে ঘটায় এই একটি একক ক্যোয়ারী হতে, যা, executes দ্বিতীয় SELECT...WHEREকল অনেকবার। এখানে আরও দেখুন: stackoverflow.com/q/9253244/550975
সেরজ সাগান

আমি কুখ্যাত [EmailAddress] must appear in the GROUP BY clause or be used in an aggregate functionত্রুটি পেয়েছি । একমাত্র ঠিক - সম্পাদনা কি sql_mode?
ভোলডিমায়ার ববিয়ার

[EmailAddress]এটি কি আপনি GROUP BYদফা
Serj Sagan

51

আপনার প্রশ্নের সাথে যে জিনিসটি ভুল তা হ'ল আপনি ইমেল এবং নাম অনুসারে গোষ্ঠী করছেন যা ইমেল এবং নামের প্রতিটি অনন্য সেট একটি করে তৈরি করে এবং তাই একত্রে

aaron and aaron@gmail.com
christy and aaron@gmail.com
john and aaron@gmail.com

3 টি আলাদা গ্রুপ হিসাবে গণ্য করা হয় বরং সমস্ত 1 টি গ্রুপের অন্তর্ভুক্ত।

নীচের হিসাবে দয়া করে কোয়েরি ব্যবহার করুন:

select emailaddress,customername from customers where emailaddress in
(select emailaddress from customers group by emailaddress having count(*) > 1)

21
আমি পছন্দ করি যে আপনি গ্রহণযোগ্য উত্তরের বিপরীতে মূল প্রশ্নের সাথে কী ভুল তা সম্পর্কে একটি ব্যাখ্যা অন্তর্ভুক্ত করেছেন।



8

শুধু মজাদার জন্য, এখানে অন্য উপায়:

;with counts as (
    select CustomerName, EmailAddress,
      count(*) over (partition by EmailAddress) as num
    from Customers
)
select CustomerName, EmailAddress
from counts
where num > 1

1
সিটিই সংস্করণটির জন্য +1 আমাদের কোডে নিজেদের পুনরাবৃত্তি করা উচিত নয়, এসকিউএল-এ কেন নিজেকে পুনরাবৃত্তি করা উচিত।
yzorg

1
আমি গণনা কলামের জন্য সংখ্যার (সংখ্যা ছাড়াই) ব্যবহার করি। _ ডিফল্ট, _ টাইপ, _সাম ইত্যাদির মতো এসকিউএল কীওয়ার্ডগুলির সাথে কলামগুলি সংঘর্ষে ঘটতে থাকলে আমি ধারাবাহিকভাবে আন্ডারস্কোর ব্যবহার করি
yzorg

4

পরিবর্তে সাব-কোয়েরি ব্যবহারের চেয়ে কোথায় এমন শর্ত যা ক্যোয়ারির সময় বাড়িয়ে দেবে যেখানে রেকর্ডগুলি বিশাল।

আমি এই সমস্যার আরও ভাল বিকল্প হিসাবে ইনার জয়েন ব্যবহার করার পরামর্শ দেব।

একই টেবিল বিবেচনা করে এটি ফলাফল দিতে পারে

SELECT EmailAddress, CustomerName FROM Customers as a 
Inner Join Customers as b on a.CustomerName <> b.CustomerName and a.EmailAddress = b.EmailAddress

এখনও আরও ভাল ফলাফলের জন্য আমি আপনাকে CustomerIDবা আপনার টেবিলের কোনও অনন্য ক্ষেত্র ব্যবহার করার পরামর্শ দেব । এর সদৃশ CustomerNameসম্ভব।


-2

অ স্বতন্ত্র সারিগুলি সন্ধান করার জন্য কিছুটা পরিবর্তন আছে ..

SELECT EmailAddress, CustomerName FROM Customers WHERE EmailAddress NOT IN
(SELECT EmailAddress FROM Customers GROUP BY EmailAddress HAVING COUNT(*) > 1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.