حذف توسط rowid oracle (14)

من در حال آزمایش چیزی در اوراکل هستم و یک جدول را با داده‌های نمونه پر می‌کنم، اما در این فرآیند به‌طور تصادفی رکوردهای تکراری بارگیری کردم، بنابراین اکنون نمی‌توانم با استفاده از برخی از ستون‌ها یک کلید اصلی ایجاد کنم.

چگونه می توان تمام خطوط تکراری را حذف کرد و تنها یکی از آنها را باقی گذاشت؟

راه حل 1)

حذف از emp جایی که rowid در آن نیست (max(rowid) را از گروه emp توسط empno انتخاب کنید).

راه حل 2)

حذف از emp در جایی که rowid in (انتخاب rid from (انتخاب rowid rid، row_number() over(پارتیشن به ترتیب empno بر اساس empno) rn از emp) جایی که rn > 1);

راه حل 3)

برای اجرای بهتر، این چیزی است که من نوشتم:
(نگاه کنید به طرح اجرا)

DELETE FROM your_table WHERE row IN (t1.rowid را از your_table انتخاب کنید t1 LEFT OUTER JOIN (MIN(rowid) را به عنوان ردیف، ستون1، ستون2، ستون3 از your_table GROUP BY ستون1، ستون2، ستون3 انتخاب کنید) co1 ON (t1. rowid) WHERE co1.rowid IS NULL)؛

اسکریپت های زیر را بررسی کنید -

ایجاد آزمون جدول (id int، sal int)؛

درج در مقادیر تست (1,100); درج در مقادیر تست (1,100); درج در مقادیر تست (2200); درج در مقادیر تست (2200); درج در مقادیر تست (3,300); درج در مقادیر تست (3,300); مرتکب شدن؛

انتخاب * از تست؛

شما 6 ورودی را در اینجا خواهید دید.
4. زیر پرس و جو را اجرا کنید -

حذف از تست در جایی که ردیف در آن قرار دارد (ردیف را انتخاب کنید از (select rowid، row_number() روی (پارتیشن به ترتیب شناسه بر اساس sal) dup از تست) جایی که dup > 1)

  1. انتخاب * از تست؛

خواهید دید که ورودی های تکراری حذف شده اند.
امیدوارم این درخواست شما را حل کند. با تشکر از:)

برای انتخاب موارد تکراری، فقط فرمت پرس و جو می تواند باشد:

SELECT GroupFunction(column1), GroupFunction(column2),..., COUNT(column1), column1, column2... FROM our_table GROUP BY column1, column2, column3... HAVING COUNT(column1) > 1

بنابراین پرس و جو صحیح در پیشنهاد دیگر این است:

DELETE FROM tablename a WHERE a.ROWID > ANY (B.ROWID از نام جدول b WHERE a.fieldname = b.fieldname AND a.fieldname2 = b.fieldname2 و .... به همین ترتیب.. برای شناسایی ردیف های تکراری انتخاب کنید.. ..)

این پرس و جو بیشترین صرفه جویی را خواهد کرد رکورد قدیمیدر پایگاه داده برای معیارهای انتخاب شده در WHERE CLAUSE .

اوراکل دارای گواهینامه (2008)

من پاسخ هایی را ندیده ام که از عبارات جدول رایج و توابع پنجره استفاده کنند. این یکی است که کار کردن با آن برای من راحت تر است.

DELETE FROM Your Table WHERE ROWID IN (WITH Duplicates AS (SELECT ROWID RID، ROW_NUMBER() OVER (PARTITION BY First_Name, Last_Name, Birth_Date) AS RN SUM(1) OVER(PARTITION BY First_Name, RBOOWEDYR, Last_UNDY) موارد قبلی و نامحدود) AS CNT FROM YourTable WHERE Load_Date IS NULL) SELECT RID FROM Duplicates WHERE RN > 1);

نکات قابل توجه:

1) ما فقط فیلدهای تکراری را در یک بخش بررسی می کنیم.

2) اگر دلیلی برای انتخاب یک نسخه تکراری نسبت به بقیه دارید، می توانید از ترتیب با بند استفاده کنید تا این ردیف دارای row_number() = 1 باشد.

3) می توانید شماره تکراری ذخیره شده را با تغییر بند Where به "Where RN>N" با N>=1 تغییر دهید (من فکر می کردم N=0 همه ردیف های دارای تکرار را حذف می کند، اما فقط همه ردیف ها را حذف کنید).

4) یک فیلد بخش Sum اضافه شده است، یک پرس و جو CTE که هر کدام را با شماره ردیف های گروه برچسب گذاری می کند. بنابراین برای انتخاب سطرهایی با موارد تکراری، از جمله عنصر اول، از "WHERE cnt > 1" استفاده کنید.

1. تصمیم گیری

حذف از emp جایی که rowid در آن نیست (max(rowid) را از گروه emp توسط empno انتخاب کنید).

2. راه حل

حذف از emp در جایی که rowid in (انتخاب rid from (انتخاب rowid rid، row_number() over(پارتیشن به ترتیب empno بر اساس empno) rn از emp) جایی که rn > 1);

3. راه حل

حذف از emp e1 جایی که rowid نیست (max(rowid) را از emp e2 که e1.empno = e2.empno انتخاب کنید).

4. راه حل

حذف از emp در جایی که rowid in (انتخاب rid from (select rowid rid, dense_rank() over(partition by empno order by rowid) rn from emp) جایی که rn > 1);

ایجاد یا جایگزینی رویه delete_duplicate_enq به عنوان مکان نما c1 انتخاب شده است * از پرس و جو. شروع برای z در حلقه c1 حذف استعلام که در آن enquiry.enquiryno = z.enquiryno و rowid > any (راویید را از استعلام که در آن enquiry.enquiryno = z.enquiryno انتخاب کنید); حلقه پایانی؛ پایان delete_duplicate_enq;

ایجاد جدول abcd(شماره شناسه(10)، نام varchar2(20)) درج در مقادیر abcd(1"abc") درج در مقادیر abcd(2"pqr") درج در مقادیر abcd(3"xyz") درج در مقادیر abcd(1"abc") درج در مقادیر abcd(2"pqr") درج در مقادیر abcd(3"xyz") * از abcd id نام 1 abc 2 pqr 3 xyz 1 abc 2 pqr 3 xyz رکورد تکراری را حذف کنید اما رکورد متمایز را در جدول نگه دارید DELETE FROM abcd a WHERE ROWID > (SELECT MIN(ROWID) FROM abcd b WHERE b.id=a.id); پرس و جوی بالا را اجرا کنید 3 ردیف حذف انتخاب کنید * از abcd id نام 1 abc 2 pqr 3 xyz

حذف ورودی ها

دستور DELETE برای حذف رکوردها از جدول استفاده می شود:

DELETE FROM جدول نام WHERE شرط.

این عبارت رکوردهای جدول مشخص شده (نه مقادیر ستون جداگانه) را که شرایط مشخص شده را برآورده می کنند حذف می کند. شرط یک عبارت بولی است، طرح های مختلفکه در آزمایشگاه های قبلی پوشش داده شده است.

پرس و جوی زیر رکوردهایی را از جدول Customer حذف می کند که در آن مقدار ستون LName "Ivanov" است:

حذف از مشتری

WHERE LName = "ایوانف"

اگر جدول حاوی اطلاعاتی در مورد چندین مشتری با نام خانوادگی ایوانف باشد، همه آنها حذف خواهند شد.

عبارت WHERE می تواند حاوی یک پرسش فرعی برای انتخاب داده ها باشد (عبارت SELECT). پرس و جوهای فرعی در یک دستور DELETE دقیقاً به همان روشی که در یک عبارت SELECT انجام می دهند کار می کنند. درخواست زیر همه مشتریان را از شهر مسکو حذف می‌کند و شناسه منحصربه‌فرد شهر با استفاده از یک درخواست فرعی بازگردانده می‌شود.

حذف از مشتری

WHERE IdCity IN (انتخاب IDCity FROM City WHERE CityName = "Moscow")

Transact-SQL SQL استاندارد را با استفاده از عبارت FROM دیگر در دستور DELETE گسترش می دهد. این پسوند join را می توان به جای یک پرسش فرعی در عبارت WHERE برای تعیین ردیف هایی که قرار است حذف شوند استفاده کرد. این به شما امکان می دهد داده ها را از FROM دوم تنظیم کنید و ردیف های مربوطه را از جدول در بند اول FROM حذف کنید. به طور خاص، پرس و جو قبلی را می توان به صورت زیر بازنویسی کرد

حذف از مشتری

از مشتری k JOIN داخلی

عملیات حذف رکوردها از جدول خطرناک است به این معنا که با خطر از دست دادن غیرقابل برگشت داده ها در صورت بروز خطاهای معنایی (اما نه نحوی) در فرمول بندی دستور SQL همراه است. برای جلوگیری از مشکل، قبل از حذف رکوردها، توصیه می کنیم ابتدا کوئری انتخاب مناسب را اجرا کنید تا ببینید کدام رکوردها حذف می شوند. بنابراین، برای مثال، قبل از اجرای کوئری حذف که قبلاً بحث شد، اجرای کوئری انتخابی مربوطه ضرری ندارد.

انتخاب کنید*

از مشتری k JOIN داخلی

شهر c ON k.IdCity = c.IdCity و c.CityName = "Moscow"

برای حذف تمام رکوردها از یک جدول، فقط از عبارت DELETE بدون استفاده کنید کلمه کلیدیجایی که. در عین حال خود جدول با تمام ستون های تعریف شده در آن ذخیره شده و آماده درج رکوردهای جدید است. به عنوان مثال، پرس و جو زیر رکوردهای همه محصولات را حذف می کند.

حذف از محصول

وظیفه برای کار مستقل:فرموله کنید زبان SQLدرخواست برای حذف همه سفارش‌هایی که حاوی هیچ کالایی نیستند (یعنی همه سفارش‌های خالی).



حذف ردیف های تکراری از یک جدول در اوراکل (14)

راه حل 1)

حذف از emp جایی که rowid در آن نیست (max(rowid) را از گروه emp توسط empno انتخاب کنید).

راه حل 2)

حذف از emp در جایی که rowid in (انتخاب rid from (انتخاب rowid rid، row_number() over(پارتیشن به ترتیب empno بر اساس empno) rn از emp) جایی که rn > 1);

راه حل 3)

من در حال آزمایش چیزی در اوراکل هستم و یک جدول را با داده‌های نمونه پر می‌کنم، اما در این فرآیند به‌طور تصادفی رکوردهای تکراری بارگیری کردم، بنابراین اکنون نمی‌توانم با استفاده از برخی از ستون‌ها یک کلید اصلی ایجاد کنم.

چگونه می توان تمام خطوط تکراری را حذف کرد و تنها یکی از آنها را باقی گذاشت؟

برای اجرای بهتر، این چیزی است که من نوشتم:
(نگاه کنید به طرح اجرا)

DELETE FROM your_table WHERE row IN (t1.rowid را از your_table انتخاب کنید t1 LEFT OUTER JOIN (MIN(rowid) را به عنوان ردیف، ستون1، ستون2، ستون3 از your_table GROUP BY ستون1، ستون2، ستون3 انتخاب کنید) co1 ON (t1. rowid) WHERE co1.rowid IS NULL)؛

اسکریپت های زیر را بررسی کنید -

ایجاد آزمون جدول (id int، sal int)؛

درج در مقادیر تست (1,100); درج در مقادیر تست (1,100); درج در مقادیر تست (2200); درج در مقادیر تست (2200); درج در مقادیر تست (3,300); درج در مقادیر تست (3,300); مرتکب شدن؛

انتخاب * از تست؛

شما 6 ورودی را در اینجا خواهید دید.
4. زیر پرس و جو را اجرا کنید -

حذف از تست در جایی که ردیف در آن قرار دارد (ردیف را انتخاب کنید از (select rowid، row_number() روی (پارتیشن به ترتیب شناسه بر اساس sal) dup از تست) جایی که dup > 1)

  1. انتخاب * از تست؛

خواهید دید که ورودی های تکراری حذف شده اند.
امیدوارم این درخواست شما را حل کند. با تشکر از:)

برای انتخاب موارد تکراری، فقط فرمت پرس و جو می تواند باشد:

SELECT GroupFunction(column1), GroupFunction(column2),..., COUNT(column1), column1, column2... FROM our_table GROUP BY column1, column2, column3... HAVING COUNT(column1) > 1

بنابراین پرس و جو صحیح در پیشنهاد دیگر این است:

DELETE FROM tablename a WHERE a.ROWID > ANY (B.ROWID از نام جدول b WHERE a.fieldname = b.fieldname AND a.fieldname2 = b.fieldname2 و .... به همین ترتیب.. برای شناسایی ردیف های تکراری انتخاب کنید.. ..)

این پرس و جو قدیمی ترین ورودی را در پایگاه داده برای معیارهای انتخاب شده در WHERE CLAUSE ذخیره می کند.

اوراکل دارای گواهینامه (2008)

من پاسخ هایی را ندیده ام که از عبارات جدول رایج و توابع پنجره استفاده کنند. این یکی است که کار کردن با آن برای من راحت تر است.

DELETE FROM Your Table WHERE ROWID IN (WITH Duplicates AS (SELECT ROWID RID، ROW_NUMBER() OVER (PARTITION BY First_Name, Last_Name, Birth_Date) AS RN SUM(1) OVER(PARTITION BY First_Name, RBOOWEDYR, Last_UNDY) موارد قبلی و نامحدود) AS CNT FROM YourTable WHERE Load_Date IS NULL) SELECT RID FROM Duplicates WHERE RN > 1);

نکات قابل توجه:

1) ما فقط فیلدهای تکراری را در یک بخش بررسی می کنیم.

2) اگر دلیلی برای انتخاب یک نسخه تکراری نسبت به بقیه دارید، می توانید از ترتیب با بند استفاده کنید تا این ردیف دارای row_number() = 1 باشد.

3) می توانید شماره تکراری ذخیره شده را با تغییر بند Where به "Where RN>N" با N>=1 تغییر دهید (من فکر می کردم N=0 همه ردیف های دارای تکرار را حذف می کند، اما فقط همه ردیف ها را حذف کنید).

4) یک فیلد بخش Sum اضافه شده است، یک پرس و جو CTE که هر کدام را با شماره ردیف های گروه برچسب گذاری می کند. بنابراین برای انتخاب سطرهایی با موارد تکراری، از جمله عنصر اول، از "WHERE cnt > 1" استفاده کنید.

1. تصمیم گیری

حذف از emp جایی که rowid در آن نیست (max(rowid) را از گروه emp توسط empno انتخاب کنید).

2. راه حل

حذف از emp در جایی که rowid in (انتخاب rid from (انتخاب rowid rid، row_number() over(پارتیشن به ترتیب empno بر اساس empno) rn از emp) جایی که rn > 1);

3. راه حل

حذف از emp e1 جایی که rowid نیست (max(rowid) را از emp e2 که e1.empno = e2.empno انتخاب کنید).

4. راه حل

حذف از emp در جایی که rowid in (انتخاب rid from (select rowid rid, dense_rank() over(partition by empno order by rowid) rn from emp) جایی که rn > 1);

ایجاد یا جایگزینی رویه delete_duplicate_enq به عنوان مکان نما c1 انتخاب شده است * از پرس و جو. شروع برای z در حلقه c1 حذف استعلام که در آن enquiry.enquiryno = z.enquiryno و rowid > any (راویید را از استعلام که در آن enquiry.enquiryno = z.enquiryno انتخاب کنید); حلقه پایانی؛ پایان delete_duplicate_enq;

ایجاد جدول abcd(شماره شناسه(10)، نام varchar2(20)) درج در مقادیر abcd(1"abc") درج در مقادیر abcd(2"pqr") درج در مقادیر abcd(3"xyz") درج در مقادیر abcd(1"abc") درج در مقادیر abcd(2"pqr") درج در مقادیر abcd(3"xyz") * از abcd id نام 1 abc 2 pqr 3 xyz 1 abc 2 pqr 3 xyz رکورد تکراری را حذف کنید اما رکورد متمایز را در جدول نگه دارید DELETE FROM abcd a WHERE ROWID > (SELECT MIN(ROWID) FROM abcd b WHERE b.id=a.id); پرس و جوی بالا را اجرا کنید 3 ردیف حذف انتخاب کنید * از abcd id نام 1 abc 2 pqr 3 xyz

پلتفرم اوراکل به شما اجازه می‌دهد تا ردیف‌ها را از جداول، نماها، نماهای مادی شده، پرسش‌های فرعی تودرتو، و نماها و جداول پارتیشن بندی شده حذف کنید.

(نام_جدول | ONLY (نام_جدول)) [نام مستعار] [(PARTITION (نام_پارتیشن) SUBPARTITION

(نام_زیربخش))] | (پرسش فرعی )]) | TABLE (collection_expression) [(+)])

متغیر INTO [،…]]

پارامترها در زیر نشان داده شده است.

جدول_نام [نام مستعار]

جدول، نما، نمای متریال شده یا جدول یا نمای پارتیشن بندی شده را مشخص می کند که از آن رکوردها حذف شوند. به صورت اختیاری، می‌توانید جدول_name را با یک طرح پیشوند اضافه کنید، یا یک اتصال پایگاه داده را بعد از table_name مشخص کنید. در غیر این صورت اوراکل از طرح و طرح فعلی استفاده خواهد کرد سرور محلیپایگاه داده. در صورت تمایل، می توانید به table_name یک نام مستعار بدهید. اگر جدول به یک ویژگی یا روش از یک نوع شی اشاره دارد، نام مستعار مورد نیاز است.

نام پارتیشن PARTITION

عملیات حذف بر روی پارتیشن مشخص شده اعمال می شود نه در کل جدول. هنگام حذف از جدول پارتیشن بندی شده، نیازی به تعیین نام پارتیشن نیست، اما در بسیاری از موارد به کاهش پیچیدگی عبارت WHERE کمک می کند.

SUBPARTITION (subpartition_name)

حذف بر روی کلید فرعی مشخص شده اعمال می شود، نه برای کل جدول.

(پرسش فرعی)])

مشخص می کند که هدف عملیات حذف، یک زیرپرس و جوی تودرتو است و نه یک جدول، نما، یا دیگر شی پایگاه داده. پارامترهای این پیشنهاد به شرح زیر است.

استعلام فرعی

یک عبارت SELECT مشخص شده است که یک سؤال فرعی است. شما می توانید هر زیرپرسوجوی استانداردی ایجاد کنید، اما نمی تواند حاوی بند های ORDER BY باشد.

فقط با خواندن

نشان می دهد که درخواست فرعی نمی تواند به روز شود.

با گزینه چک

اوراکل هر گونه تغییر در جدول راه دور را که در مجموعه نتایج جستجوی فرعی قابل مشاهده نباشد رد می کند.

CONSTRAINT constraint_name

سیستم اوراکل تغییراتی را که شما ایجاد می کنید بر اساس محدودیتی به نام constraint_name محدود می کند.

جدول (بیان برای رول کردن) [(+)]

سیستم Oracle با rollexpression به عنوان یک جدول برخورد می کند، اگرچه در واقع می تواند یک subquery، تابع یا سایر سازنده مجموعه باشد. در هر صورت، مقدار بازگردانده شده توسط عبارت For Rollection باید یک جدول تودرتو یا VARRAY باشد.

عبارت RETURNING

ردیف های تحت تأثیر فرمان را بازیابی می کند که در آن دستور DELETE معمولاً فقط یک تعداد را برمی گرداند. ردیف های حذف شده. بند RETURNING را می توان در صورتی استفاده کرد که هدف دستور یک جدول، یک نمای مادی شده یا یک نمای روی یک جدول پایه واحد باشد. اگر از بند هنگام حذف یک ردیف استفاده شود، مقادیر از ردیف حذف شده که توسط عبارت تعیین می شود در متغیرهای PL/SQL و متغیرهای bind ذخیره می شوند. اگر از بند هنگام حذف چندین ردیف استفاده شود، مقادیر ردیف های حذف شده که توسط عبارت تعیین می شوند در آرایه های bind ذخیره می شوند.

متغیر INTO

متغیرهایی مشخص می شوند که مقادیر بازگشتی در نتیجه عبارت RETURNING در آنها نوشته می شود.

هنگام اجرای دستور DELETE، Oracle فضای آزاد شده در جدول (یا جدول نمای زیرین) را به جدول یا فهرستی که داده ها در آن ذخیره شده است، برمی گرداند.

اگر داده‌ها از نما حذف شوند، نما نمی‌تواند شامل عملیات مجموعه، کلمه کلیدی DISTINCT، پیوستن، یک تابع تجمیع، یک تابع تحلیلی، پرس‌وجوهای فرعی SELECT، یک بند GROUP BY، یک ORDER BY clause، یک CONNECT BY یا یک START باشد. با بند.

در زیر نمونه ای وجود دارد که در آن داده ها را از یک سرور راه دور حذف می کنیم.

حذف از اسکات [ایمیل محافظت شده];

در مثال زیر

ما داده ها را از جدول مشتق شده مشخص شده در عبارت مجموعه حذف می کنیم.

DELETE TABLE (نام مخاطب را از مشتریان انتخاب کنید

با WHERE c.customerid="BOTTM") s WHERE s. region IS NULL OR s.country="MEXICO";

و در اینجا یک نمونه از حذف از بخش است.

DELETE FROM sales PARTITION (sales_q3_1997) WHERE تعداد > 10000;

در نهایت در مثال زیر از عبارت RETURNING برای دیدن مقادیر حذف شده استفاده می کنیم.

DELETE FROM کارمند WHERE job_id=13

AND hire_date + TO_YMINTERVAL("01-06") =.

مثال قبلی رکوردها را از جدول کارکنان حذف می کند و مقادیر j obi vl را به یک متغیر از پیش تعریف شده برمی گرداند: intol.