ورود

View Full Version : کمک جهت اخذ کوئری از یک جدول لاگ برای گزارش گیری



ashena29
شنبه 20 اسفند 1384, 09:44 صبح
جدولی وجود دارد که به ازای هر رکورد(سطر)با مشخصه oldیک رکورد (سطر)با مشخصه new وجود دارد حال به دنبال select ای که فقط فیلد هایی که تغییر کرده اند را نمایش دهد و فیلد هایی که تغییری در سطر new نداشته اند خالی بر گرداند
جهت روشن شدن موضوع یک شکل به همراه این بحث ارائه می شود که با دیدن آن فکر کنم موضوع مشخص گردد
در واقع جدول 1 را داریم و می خواهیم به جدول 2 برسیم در ضمن یک فیلد کلید نیز در دو جدول مشترک می باشد یک فیلد تاریخ
از دوستانی که می توانند پاسخی دهند سپاسگذار می شوم

Inspiration
شنبه 20 اسفند 1384, 11:02 صبح
من فرض ر. بر این گرفتم که یک فیلد IDrow ی هست که برای رکوردهای OLD و New مرتبط یکسان است.چون شما چنین فیلدی رو لحاظ نکردید و نمی شه فهمید کدام New مال کدام Old است



SELECT CASE
WHEN Frst.field1=(SELECT Sec.fied1 FROM TblTest Sec WHERE Frst.IDrow=Sec.IDrow AND Frst.LOG<>Sec.Log)
THEN ''
ELSE Frst.field1,
CASE
WHEN Frst.field2=(SELECT Sec.fied2 FROM TblTest Sec WHERE Frst.IDrow=Sec.IDrow AND Frst.LOG<>Sec.Log)
THEN ''
ELSE Frst.field2,
CASE
WHEN Frst.field3=(SELECT Sec.fied3 FROM TblTest Sec WHERE Frst.IDrow=Sec.IDrow AND Frst.LOG<>Sec.Log)
THEN ''
ELSE Frst.field3

FROM TblTest Frst

AminSobati
شنبه 20 اسفند 1384, 21:01 عصر
دوست عزیزم،
IDها رو به چه شکل توزیع کردین؟ آیا هر دو رکورد قدیمی و جدید، یک ID مشترک دارند؟ از طرفی، این طراحی اصلا مناسب نیست و میبایست یک جدول برای old و یکی برای new بگیرید و بینشون ارتباط one-to-one برقرار کنید. این حالت، انعطاف پذیرترین شکل ممکن برای Query نوشتن رو خواهد داشت. روش مذکور توسط دوست عزیزمون Inspiration (اگر چه end کم داره و sytanx error میده) ولی برای حجم اطلاعات کم مناسبه. من این روش رو با روش one-to-one برای ده هزار رکورد آزمایش کردم. روش اول تقریبا 10 ثانیه و روش دوم کمتر از یک ثانیه زمان میبره.
با افزایش حجم اطلاعات، این تفاوت بیشتر میشه. دلیلش هم روشنه، در روش اول تعداد IO روی دیسک چندین برابر روش دوم هست.

ashena29
یک شنبه 21 اسفند 1384, 08:28 صبح
با تشکر از دوستان عزیز Inspiration و جناب استاد ثباتی
روش پیشنهادی جناب Inspiration برای اطلاعات با حجم زیاد جواب نمی دهد در ضمن فیلد مشترک بین دو رکورد جدید و قدیم یک فیلد (تاریخ و ساعت) می باشد که فکر می کنیداین فیلد مناسب است یا خیر ؟

Inspiration
یک شنبه 21 اسفند 1384, 12:29 عصر
با تشکر از دوستان عزیز Inspiration و جناب استاد ثباتی
روش پیشنهادی جناب Inspiration برای اطلاعات با حجم زیاد جواب نمی دهد در ضمن فیلد مشترک بین دو رکورد جدید و قدیم یک فیلد (تاریخ و ساعت) می باشد که فکر می کنیداین فیلد مناسب است یا خیر ؟


اول ممنون از آقای ثباتی. بله من یه End جا انداختم, شرمنده که متوجهش نشدم و تستش نکردم.
درسته دوست عزیز آقای ثباتی هم گفتند برای حجم بالا جواب نمی ده . اما شما یک Query خواستین. Queryشم همینه. وگرنه روشها و راههای بهتری برای گرفتن جواب هست. از جمله راهی که آقای ثباتی گفتند.

در مورد فیلد تاریخ و ساعت به عنوان فیلد مشترک , امکانپذیر هست ,غلط هم نیست , اما جالب نیست و توصیه نمی شه!!!

AminSobati
یک شنبه 21 اسفند 1384, 13:28 عصر
موافقم، فیلد DateTime جالب نیست. شما میتونین زمان رو هم به عنوان یک فیلد در جدولتون داشته باشید اما بهتره از یک ID عددی استفاده کنین