أدخل في قيم درجة الحرارة (حدد ... order حسب المعرف)

StackOverflow https://stackoverflow.com/questions/263101

  •  06-07-2019
  •  | 
  •  

سؤال

أنا أستخدم Informix (الإصدار 7.32) DB. في عملية واحدة ، أقوم بإنشاء جدول مؤقت مع معرف الجدول العادي وعمود تسلسلي (لذلك سيكون لدي جميع المعرفات من الجدول العادي مرقمة بشكل مستمر). لكني أريد إدراج المعلومات من الجدول العادي الذي طلبه معرف شيء مثل:

CREATE TEMP TABLE tempTable (id serial, folio int );

INSERT INTO tempTable(id,folio)
SELECT 0,folio FROM regularTable ORDER BY folio;

ولكن هذا يخلق خطأ في بناء الجملة (بسبب الترتيب بواسطة)

هل هناك أي طريقة يمكنني طلب المعلومات ثم أدخلها على الإغراء؟

تحديث: السبب في أنني أرغب في القيام بذلك هو أن الجدول العادي يحتوي على حوالي 10000 عنصر وفي ملف JSP ، يجب أن يظهر كل سجل ، ولكنه سيستغرق وقتًا طويلاً ، وبالتالي فإن السبب الحقيقي الذي أرغب في القيام بذلك هو قمة الإخراج. هذا الإصدار من Informix ليس لديه Limit ولا Skip. لا يمكنني إعادة ترقيم المسلسل لأنه في علاقة ، وهذا هو الحل الوحيد الذي يمكننا الحصول على عدد ثابت من النتائج في صفحة واحدة (على سبيل المثال 500 نتيجة لكل صفحة). في الجدول العادي ، تخطيت المعرف (المسمى Folio) لأنه تم حذفها. لو كنت سأضع

SELECT * FROM regularTable WHERE folio BETWEEN X AND Y

سأحصل على 300 في صفحة واحدة ، ثم 500 في الصفحة التالية

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

المحلول

قد تجربه تكرار المؤشر فوق SELECT ... اطلب عن طريق إجراء الإدراج داخل الحلقة.

نصائح أخرى

يمكنك القيام بذلك عن طريق تقسيم SQL إلى جدولين مؤقتين:

CREATE TEMP TABLE tempTable1 (
id serial,
folio int);

SELECT folio FROM regularTable ORDER BY folio
INTO TEMP tempTable2;

INSERT INTO tempTable1(id,folio) SELECT 0,folio FROM tempTable2;

في Informix عند استخدام SELECT كبنى فرعي في عبارة إدراج ، أنت يقتصر على مجموعة فرعية من بناء الجملة.

لا يتم دعم بنود الاختيار التالية في هذه الحالة:

  • في درجة الحرارة
  • ترتيب حسب
  • اتحاد.

بالإضافة إلى ذلك ، لا يمكن للفقرة من SELEC أن يشير إلى نفس الجدول كما هو مشار إليه من قبل الإدراج (وليس هذا مهم في قضيتك).

لقد مرت سنوات منذ أن عملت على Informix ، ولكن ربما ينجح شيء من هذا القبيل:

INSERT INTO tempTable(id,folio)
SELECT 0, folio 
FROM (
    SELECT folio FROM regularTable ORDER BY folio
);

ليس من المنطقي طلب الصفوف أثناء إدراجك في جدول. لا تسمح لك قواعد البيانات العلائقية بتحديد ترتيب الصفوف في الجدول.

حتى لو استطعت ، فإن SQL لا يضمن أن الاستعلام سيعيد الصفوف بأي ترتيب ، مثل الطلب الذي أدخلته. يجب عليك تحديد ORDER BY بند لضمان طلب للحصول على نتيجة استعلام.

لذلك لن يكون من الجيد تغيير الترتيب الذي تقوم فيه بإدراج الصفوف.

كما ذكر بيل ، لا يوجد الكثير من النقطة التي تطلب المدخلات ، فأنت بحاجة حقًا إلى طلب الإخراج. في المثال التبسيط الذي قدمته ، لا معنى له ، لذلك لا يمكنني إلا أن أفترض أن المشكلة الحقيقية التي تحاول حلها هي أكثر تعقيدًا - ربما؟

الوظيفة التي تتبعها CREATE SEQUENCE, ، لكنني متأكد من أنها غير متوفرة في مثل هذا الإصدار القديم من Informix.

إذا كنت بحاجة حقًا إلى القيام بما تطلبه ، فيمكنك النظر فيه UNLOADجي البيانات بالترتيب المطلوب ، ثم LOADجي مرة أخرى. من شأنه أن يضمن تخصيص القيم التسلسلية بالتتابع.

هل سيحب شيء هذا العمل؟

SELECT
    folio
FROM
    (
        SELECT
            ROWNUM n,
            folio
        FROM
            regularTable
        ORDER BY 
            folio
    )
WHERE
    n BETWEEN 501 AND 1000

قد لا يكون ذلك فعالًا بشكل رهيب إذا كان الجدول أكبر أو كنت تجلب "صفحات" لاحقًا ، لكن صفوف 10K صغيرة جدًا.

لا أتذكر ما إذا كان لدى Informix مفهوم Rownum ، فأنا أستخدم Oracle.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top