سؤال

كيفية عمل الترحيل في Pervasive SQL (الإصدار 9.1)؟أحتاج إلى القيام بشيء مماثل مثل:

//MySQL
SELECT foo FROM table LIMIT 10, 10

لكن لا يمكنني العثور على طريقة لتحديد الإزاحة.

هل كانت مفيدة؟

المحلول 4

انتهى بي الأمر بإجراء الترحيل في الكود.أنا فقط تخطي السجلات الأولى في الحلقة.

اعتقدت أنني قمت بإنشاء طريقة سهلة لإجراء الترحيل، ولكن يبدو أن SQL السائد لا يسمح ببنود الطلب في الاستعلامات الفرعية.ولكن هذا يجب أن يعمل على قواعد بيانات أخرى (لقد اختبرته على فايربيرد)

select *
from (select top [rows] * from
(select top [rows * pagenumber] * from mytable order by id)
order by id desc)
order by id

نصائح أخرى

الاستعلام الذي تم اختباره في PSQL:

select top n * 
from tablename 
where id not in(
select top k id
from tablename 
) 

لجميع n = عدد السجلات التي تحتاج إلى جلبها في المرة الواحدة.و k = مضاعفات n (على سبيل المثال.ن = 5؛ك=0،5،10،15،....)

يتطلب الترحيل لدينا أن نكون قادرين على تمرير رقم الصفحة الحالية وحجم الصفحة (مع بعض معلمات التصفية الإضافية) كمتغيرات.نظرًا لأن تحديد أعلىpage_size لا يعمل في MS SQL، فقد توصلنا إلى إنشاء جدول مؤقت أو متغير لتعيين هوية للمفتاح الأساسي لكل صف يمكن تصفيتها لاحقًا للحصول على رقم الصفحة وحجمها المطلوبين.

** لاحظ أنه إذا كان لديك مفتاح GUID أساسي أو مفتاح مركب، فما عليك سوى تغيير معرف الكائن في الجدول المؤقت إلى معرف فريد أو إضافة أعمدة المفاتيح الإضافية إلى الجدول.

الجانب السلبي لهذا هو أنه لا يزال يتعين عليه إدراج كافة النتائج في الجدول المؤقت، ولكن على الأقل هذه هي المفاتيح فقط.يعمل هذا في MS SQL، ولكن يجب أن يكون قادرًا على العمل مع أي قاعدة بيانات بأقل قدر من التعديلات.

DECLARE page_number int ، page_size int - أضف أي معلمات بحث إضافية هنا

- أنشئ الجدول المؤقت بعمود الهوية والمعرف
--من السجل الذي ستختاره.هذا في الذاكرة
--table، لذلك إذا كان عدد الصفوف التي ستدرجها أكبر
--من 10000، فيجب عليك استخدام جدول مؤقت في tempdb
--بدلاً من.للقيام بذلك، استخدم
- إنشاء جدول #temp_table (row_num int IDENTITY(1,1)، objectid int)
- وقم بتغيير كافة المراجع إلى @temp_table إلى #temp_table
DECLARE TEMP_TABLE TABLE (ROW_NUM Int Identity (1،1) ، ObjectID int)

- أدخل في الجدول المؤقت بمعرفات السجلات
- نريد العودة.من المهم التأكد من الأمر
--يعكس ترتيب السجلات المراد إرجاعها بحيث يتم عرضrow_num
--يتم تعيين القيم بالترتيب الصحيح ونقوم باختيار
- السجلات الصحيحة بناءً على الصفحة
أدخل في temp_table (ObjectId)

/* مثال:حدد أن إدراج السجلات في الجدول المؤقت
حدد شخصية
من شخص مع (نولوك)
درجة الانضمام الداخلية مع (nolock) على درجة.
حيث person.lastname = @last_name
أمر من قبل person.lastname ASC ، person.firsname ASC
*/

--احصل على إجمالي عدد الصفوف التي قمنا بمطابقتها
إعلان total_rows int
SETTAL_ROWS = ROWCOUNT
- حساب العدد الإجمالي للصفحات بناءً على عدد الصفحات
--الصفوف المتطابقة وحجم الصفحة التي تم تمريرها كمعلمة
إعلان total_pages int
--أضف @page_size - 1 إلى إجمالي عدد الصفوف
- حساب العدد الإجمالي للصفحات.وذلك لأن SQL
--Alwasy يتم التقريب لأسفل لتقسيم الأعداد الصحيحة
settal_pages = (total_rows + page_size - 1) / page_size

- قم بإرجاع مجموعة النتائج التي نهتم بها من خلال الانضمام
--العودة إلى @temp_table والتصفية حسبrow_num
/* مثال:تحديد البيانات للعودة.إذا تم الانتهاء من الإدراج
بشكل صحيح ، يجب عليك دائمًا الانضمام إلى الجدول الذي يحتوي
الصفوف للعودة إلى العمود ObjectID على temp_table

اختر شخصًا.*
من الشخص الذي يعاني من (nolock) Inner JointTemp_Table TT
على person.personid = tt.ObjectId
*/
- قم بإرجاع الصفوف الموجودة في الصفحة التي نهتم بها فقط
- والترتيب حسب عمودrow_num الخاص بـtemp_table للتأكد
- نحن نختار السجلات الصحيحة
حيث tt.row_num <(page_size * page_number) + 1
و TT.ROW_NUM> (page_size * page_number) - page_size
أمر بواسطة tt.row_num

أواجه هذه المشكلة في MS Sql أيضًا ...لا توجد وظائف الحد أو رقم الصف.ما أفعله هو إدراج المفاتيح الخاصة بنتيجة الاستعلام النهائية (أو في بعض الأحيان قائمة الحقول بأكملها) في جدول مؤقت يحتوي على عمود هوية...ثم أحذف من الجدول المؤقت كل شيء خارج النطاق الذي أريده ...ثم استخدم صلة مع المفاتيح والجدول الأصلي لإعادة العناصر التي أريدها.يعمل هذا إذا كان لديك مفتاح فريد ولطيف - وإذا لم يكن لديك، حسنًا...هذه مشكلة تصميم في حد ذاتها.

البديل ذو الأداء الأفضل قليلاً هو تخطي خطوة الحذف واستخدام أرقام الصفوف في الصلة النهائية.تحسين آخر للأداء هو استخدام عامل التشغيل TOP بحيث لا تضطر على الأقل إلى الحصول على الأشياء بعد نهاية ما تريد.

لذا...بالرمز الزائف..للاستيلاء على العناصر 80-89...

create table #keys (rownum int identity(1,1), key varchar(10))

insert #keys (key)
select TOP 89 key from myTable ORDER BY whatever

delete #keys where rownumber < 80

select <columns> from #keys join myTable on #keys.key = myTable.key
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top