نقل قول: حذف رکورد های تکراری
با سلام
یکی از مهمترین خصوصیات اوراکل توانایی شناسایی و حذف سطرهای تکراری یک جدول است. این کار به روش های گوناگونی صورت می پذیرد :
1-یکی از بهترین روش ها Join کردن جدول با خودش است مانند مثال زیر :
select
book_unique_id,
page_seq_nbr,
image_key
from
page_image a
where
rowid >
(select min(rowid) from page_image b
where
b.key1 = a.key1
and
b.key2 = a.key2
and
b.key3 = a.key3
);
2-به نظرم از تابع Rank نیز می توان برای این کار استفاده کرد، مانند مثال زیر :
delete from $table_name where rowid in
(
select "rowid" from
(select "rowid", rank_n from
(select rank() over (partition by $primary_key order by rowid) rank_n, rowid as "rowid"
from $table_name
where $primary_key in
(select $primary_key from $table_name
group by $all_columns
having count(*) > 1
)
)
)
where rank_n > 1
)
نقل قول: حذف رکورد های تکراری
سلام
بسیار سپاسگذارم جناب رسول بابت راهنمایی تان؛
نقل قول: حذف رکورد های تکراری
نقل قول:
نوشته شده توسط
رسول_57
با سلام
یکی از مهمترین خصوصیات اوراکل توانایی شناسایی و حذف سطرهای تکراری یک جدول است. این کار به روش های گوناگونی صورت می پذیرد :
1-یکی از بهترین روش ها Join کردن جدول با خودش است مانند مثال زیر :
select
book_unique_id,
page_seq_nbr,
image_key
from
page_image a
where
rowid >
(select min(rowid) from page_image b
where
b.key1 = a.key1
and
b.key2 = a.key2
and
b.key3 = a.key3
);
2-به نظرم از تابع Rank نیز می توان برای این کار استفاده کرد، مانند مثال زیر :
delete from $table_name where rowid in
(
select "rowid" from
(select "rowid", rank_n from
(select rank() over (partition by $primary_key order by rowid) rank_n, rowid as "rowid"
from $table_name
where $primary_key in
(select $primary_key from $table_name
group by $all_columns
having count(*) > 1
)
)
)
where rank_n > 1
)
ببخشید یک سوال دیگر هم داشتم:
چطور می توان سطر های یک resultset را که به وسیله دستور ordered by مرتب شده update کرد؟
نقل قول: حذف رکورد های تکراری
با سلام
اگر بتوانید به زبان Pl/SQL برنامه بنویسید و اگر بنده منظور شما را درست فهمیده باشم ، مبحثی به نام (CQN (Continuous Query Notification در اوراکل وجود دارد که شما می توانید یک یا چند جدول را نشانه گذاری کنید تا هر تغییری در آن رخ می دهد به شما اعلام نماید و به راحتی نتایج هر کوئری را به روز رسانی کند . اگر خواستید جستجویی بنمایید و اگر مشکلی بود بنده در حد بضاعت در خدمتم .
نقل قول: حذف رکورد های تکراری
نقل قول:
نوشته شده توسط
رسول_57
1-یکی از بهترین روش ها Join کردن جدول با خودش است مانند مثال زیر :
select
book_unique_id,
page_seq_nbr,
image_key
from
page_image a
where
rowid >
(select min(rowid) from page_image b
where
b.key1 = a.key1
and
b.key2 = a.key2
and
b.key3 = a.key3
);
سلام؛
جناب رسول عزیز، اگر امکان دارد دوباره می خواستم مزاحمتان شوم.
در کدهای نوشته شده در بالا، اگر key1,key2 یا key3 مقادیر null داشته باشند برنامه نمی تواند رکوردهای یکسان را تشخیص دهد. چه کار باید بکنم؟
========
یک سوال دیگر هم داشتم،
من الان رکورد ها را یک بار select می کنم
بعد علامت می زنم
بعد پاک می کنم.
اگر بخواهم برنامه را طوری تغییر دهم که یک باره delete کند باید چه کار کنم؟
یعنی به جای آن کد ابتدایی select کد delete قرار بگیرد یا مثلا بنویسم:
delete from table where col1 in
(select
...
(
متشکر می شوم اگر پاسخ بفرمایید.
همین طور اگر جناب رسول تشریف ندارند از سایر دوستان تقاضا دارم بنده را راهنمایی بفرمایند.
یا علی
===========ویرایش=======
مشکلم برطرف شد. برنامه را باید این طور می نوشتم:
select * from TICKERS a
where rownumber >
(select min(rownumber) from TICKERS b where
b.NAME = a.NAME
and (b.price = a.PRICE or (b.price is null and a.price is null))
and (b.volume = a.volume or (b.volume is null and a.volume is null))
);
سوال دوم هم اهمیت (زیادی) ندارد.
باز هم بابت راهنمایی پیشین از شما تشکر می کنم.
:تشویق: :تشویق: :تشویق: :تشویق:
یا علی
===========پایان ویرایش========
نقل قول: حذف رکورد های تکراری
با سلام
ممنون بابت لطفتان . اما در مورد سوال دومتان خیلی راحت می توان از دستور delete به جای Select استفاده کرد . نیاز به دو مرحله کردن کارها نیست . هر چند لزوما با توجه به قانون جامعیت ارجاعی ممکن است رکوردهایی که حذف می گردد با رکوردهایی که در مرحله اول انتخاب گردید یکسان نباشد.
با تشکر