আমি কীভাবে ওরাকলে একটি সারণীতে সদৃশ মানগুলি পাই?


276

কোন সাধারণ এসকিউএল স্টেটমেন্টটি কোনও প্রদত্ত কলামের জন্য সদৃশ মান এবং ওরাকল ডাটাবেস সারণিতে তাদের উপস্থিতির গণনা ফিরিয়ে দেবে?

উদাহরণস্বরূপ: JOBSকলাম সহ আমার একটি টেবিল রয়েছে JOB_NUMBER। আমার কোনও সদৃশ আছে কিনা তা আমি কীভাবে জানতে পারি JOB_NUMBERএবং সেগুলি কতবার নকল হয়েছে?


1
অন্যান্য সমাধানের stackoverflow.com/questions/4522431/...
zloctb

উত্তর:


608
SELECT column_name, COUNT(column_name)
FROM table_name
GROUP BY column_name
HAVING COUNT(column_name) > 1;

1
ধন্যবাদ - আমি এই উত্তরটি পেয়েছি এবং আপনি এটি এখানে পোস্ট করার জন্য আমাকে মারধর করেছেন! : ও)
অ্যান্ড্রু

3
আপনাকে স্বাগতম. এখন আমি গণনা (কলাম) এবং গণনা (*) এর মধ্যে পার্থক্য সম্পর্কে নিজের প্রশ্ন পোস্ট করতে চলেছি। :)
বিল করুন

44
+1 4 বছর পরে, এখনও ভাল কাজ করে এবং একাধিক কলামগুলি যতক্ষণ না সেগুলিতে রয়েছে সেগুলি নির্বাচন করার জন্য সামঞ্জস্য করা যেতে পারে group by: select column_one, column_two, count(*) from tablename group by column_one, column_two having count(column_one) > 1;ইত্যাদি
আমোস এম কার্পেন্টার

4
বা এমনকি having count(*) > 1: ডি
স্টানিস্লাভ মামনটোভ

3
8 বছরেরও বেশি পরে +1, এখনও ওরাকল এবং মাইএসকিউএল (লাইন থাকার ক্ষেত্রে গণনা কার্যের পরে স্থান অপসারণ) উভয় সর্বশেষ সংস্করণের জন্য ভাল কাজ করে।
ফ্যাট এইচভিভি

58

অন্য উপায়:

SELECT *
FROM TABLE A
WHERE EXISTS (
  SELECT 1 FROM TABLE
  WHERE COLUMN_NAME = A.COLUMN_NAME
  AND ROWID < A.ROWID
)

সূচক চালু থাকলে সূক্ষ্ম (যথেষ্ট দ্রুত) কাজ করে column_name। এবং সদৃশ সারিগুলি মুছতে বা আপডেট করার সর্বোত্তম উপায়।


3
+1 বহু-কলামের সদৃশগুলির জন্য ভাল কাজ করে (যেমন আপনি যখন কয়েকটি কলামে একটি অনন্য বাধা যুক্ত করতে চান), আমি নকল ক্ষেত্রের মানগুলি + অন্য ক্ষেত্রগুলি প্রয়োজনবোধে তালিকা তৈরি করার জন্য গ্রুপের চেয়ে এই পদ্ধতির কম "অনমনীয়" পেয়েছি।
ফ্রস্টি জেড

3
কেবল স্পষ্ট করে বলার জন্য, (এটি আমার কাছে প্রথমে স্পষ্ট ছিল না) এই কোয়েরিটি কেবল নকলগুলিই ফেরত দেয়, এটি প্রথম আসল প্রবেশটি ফিরিয়ে দেয় না, এজন্যই এটি অনন্য প্রতিবন্ধকতার উপর ভিত্তি করে ডুপ্লিকেটগুলি মুছতে ভাল কাজ করে more 1 কলাম আপনি এই ক্যোয়ারির সাথে সদৃশ আইডি নির্বাচন করতে পারেন এবং তারপরে সদৃশগুলি মুছতে ব্যবহার করুন।
ম্যাথহেব

1
যদি আপনি <তে! = পরিবর্তন করেন তবে আপনি সেই সমস্ত রেকর্ড পাবেন যা সদৃশ। শুধু দ্বিতীয় বা তৃতীয় রেকর্ড নয়
মুর

33

আমি ভাবতে পারি সবচেয়ে সহজ:

select job_number, count(*)
from jobs
group by job_number
having count(*) > 1;

1
আমি কীভাবে সমস্ত কলাম পেতে পারি?
আসিফ মোশতাক

2
চাকরি থেকে * নির্বাচন করুন যেখানে চাকরী_সংখ্যায় আছেন (চাকরি সংখ্যা থেকে জব_নম্বার নির্বাচন করুন কাজের সংখ্যার (*)> 1)
জোসেফস্টাইন্স

17

আপনার যদি ডুপ্লিকেটের প্রকৃত সংখ্যা জানতে না চান তবে আপনার ফিরে আসা কলামগুলিতেও গণনা করার দরকার নেই। যেমন

SELECT column_name
FROM table
GROUP BY column_name
HAVING COUNT(*) > 1

7

কেমন:

SELECT <column>, count(*)
FROM <table>
GROUP BY <column> HAVING COUNT(*) > 1;

উপরের উদাহরণটির উত্তর দিতে, এটির মতো দেখতে হবে:

SELECT job_number, count(*)
FROM jobs
GROUP BY job_number HAVING COUNT(*) > 1;

5

যদি একাধিক কলামগুলি অনন্য সারি চিহ্নিত করে (যেমন সম্পর্কের টেবিল) সেখানে আপনি নিম্নলিখিত ব্যবহার করতে পারেন

সারি আইডি ব্যবহার করুন উদাহরণস্বরূপ emp_dept (এমপিড, ডিপেন্ডেড, স্টার্টেটেট, শেষ তারিখ) ধরুন এমপিড এবং ডেপটিড অনন্য এবং সেই ক্ষেত্রে সারি চিহ্নিত করুন

select oed.empid, count(oed.empid) 
from emp_dept oed 
where exists ( select * 
               from  emp_dept ied 
                where oed.rowid <> ied.rowid and 
                       ied.empid = oed.empid and 
                      ied.deptid = oed.deptid )  
        group by oed.empid having count(oed.empid) > 1 order by count(oed.empid);

এবং যদি এই জাতীয় টেবিলে প্রাথমিক কী থাকে তবে রোউইডের পরিবর্তে প্রাথমিক কী ব্যবহার করুন, উদাহরণস্বরূপ আইডি পিকে হয়

select oed.empid, count(oed.empid) 
from emp_dept oed 
where exists ( select * 
               from  emp_dept ied 
                where oed.id <> ied.id and 
                       ied.empid = oed.empid and 
                      ied.deptid = oed.deptid )  
        group by oed.empid having count(oed.empid) > 1 order by count(oed.empid);

4

এরকম

select count(j1.job_number), j1.job_number, j1.id, j2.id
from   jobs j1 join jobs j2 on (j1.job_numer = j2.job_number)
where  j1.id != j2.id
group by j1.job_number

আপনাকে নকল করা সারিগুলির আইডি দেবে।



2

আমি সাধারণত ওরাকল অ্যানালিটিক ফাংশন ROW_NUMBER () ব্যবহার করি ।

আপনি কি সদৃশগুলি আপনি একটি অনন্য সূচক বা প্রাথমিক কলাম নির্মিত কী (সংক্রান্ত আছে চেক করতে চান বলুন c1, c2, c3)। তারপর আপনি এই ভাবে চলে যাবে, আপ আনয়ন ROWIDসারি যেখানে ঘটায় লাইনের সংখ্যা গুলি ROW_NUMBER()হল >1:

Select * From Table_With_Duplicates
      Where Rowid In
                    (Select Rowid
                       From (Select Rowid,
                                    ROW_NUMBER() Over (
                                            Partition By c1 || c2 || c3
                                            Order By c1 || c2 || c3
                                        ) nbLines
                               From Table_With_Duplicates) t2
                      Where nbLines > 1)


1

আমি এটির পুরানো থ্রেডটি জানি তবে এটি কোনওর জন্য সাহায্য করতে পারে।

নীচের সদৃশ ব্যবহারের জন্য পরীক্ষা করার সময় যদি আপনাকে টেবিলের অন্যান্য কলামগুলি মুদ্রণ করতে হয়:

select * from table where column_name in
(select ing.column_name from table ing group by ing.column_name having count(*) > 1)
order by column_name desc;

প্রয়োজনে ক্লজটিতে কিছু অতিরিক্ত ফিল্টার যুক্ত করতে পারে।


0

1. সমাধান

select * from emp
    where rowid not in
    (select max(rowid) from emp group by empno);

এই আসল পোস্টারটি মুছে ফেলার কথা কখনও উল্লেখ করেনি, কেবল গণনা করা হচ্ছে
জেফ

-1

এছাড়াও আপনি টেবিলের সমস্ত সদৃশ মান তালিকাতে reqitem বলতে এই জাতীয় কিছু চেষ্টা করতে পারেন

SELECT count(poid) 
FROM poitem 
WHERE poid = 50 
AND rownum < any (SELECT count(*)  FROM poitem WHERE poid = 50) 
GROUP BY poid 
MINUS
SELECT count(poid) 
FROM poitem 
WHERE poid in (50)
GROUP BY poid 
HAVING count(poid) > 1;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.