كيف يمكنني استخدام الاستعلام عن الاستعلام UNION على مجموعات السجلات n عندما يكون نطاق var مطلوبًا؟

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

  •  20-08-2019
  •  | 
  •  

سؤال

أود أن أكون قادرًا على إجراء استعلام إلى UNION لعدد غير معروف من مجموعة السجلات.ومع ذلك، عند إجراء استعلام استعلام، لا يُسمح بالنقاط أو الأقواس في أسماء مجموعات السجلات.

على سبيل المثال هذا يفشل:

<cfquery name="allRecs" dbtype="query">
    SELECT * FROM recordset[1]
    UNION
    SELECT * FROM recordset[2]
</cfquery>

يعمل استخدام أسماء المتغيرات الديناميكية مثل "recordset1" ولكن هذا موجود في وظيفة ويحتاج إلى نطاق var حتى لا أتمكن من إنشاء أسماء المتغيرات ديناميكيًا دون إنتاج تسرب للذاكرة في كائن ثابت.

هل هناك أي أفكار أخرى؟

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

المحلول

والمهمة الصعبة. يمكنني أن أتصور حل مع حلقة متداخلة على أساس GetColumnNames()، وذلك باستخدام QueryAddRow() وQuerySetCell(). انها لن تكون واحدة أكثر كفاءة، ولكنها ليست بطيئة حقا. يعتمد على حجم المهمة، بطبيعة الحال.

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

<cfset var local = StructNew()>

<cfquery name="local.union" dbtype="query">
  SELECT * FROM argument1
  <cfloop from="2" to="#ArrayLen(arguments)#" index="local.i">
    <cfif IsQuery(arguments[local.i])>
      UNION
      SELECT * FROM argument#local.i#
    </cfif>
  </cfloop>
</cfquery>

<cfreturn local.union>

نصائح أخرى

بعد نشر السؤال توصلت إلى حلين ولكن قد يكون هناك حل أفضل

  • يمكنني كتابة متغيرات مسماة ديناميكيًا في نطاق الوسائط ثم الرجوع إليها دون نطاقها في الاستعلام

  • قم بإنشاء دالة تقبل مجموعتين من السجلات كوسائط وتقوم بإرجاع مجموعة سجلات واحدة مدمجة.يمكن تكرار ذلك لإضافة مجموعة سجلات تدريجيًا في كل مرة.أنا متأكد من أن هذا غير فعال للغاية مقارنة بتنفيذ جميع UNIONs في استعلام واحد.

وبعد قليل سريع من بدس حولها، ولقد وجدت هذا: queryConcat في CFLib.org. ويستخدم queryaddrow / querysetcell لسلسلة اثنين استفسار.

وأضفت وظيفة سريعة (دون التحقق من الخطأ، أو التحقق من صحة البيانات، ولذا فإنني لن استخدامها كما هو):

<cffunction name="concatenate">
     <cfset var result = arguments[1]>
     <cfloop from="2" to="#arraylen(arguments)#" index="i">
             <cfset result=queryconcat(result, arguments[i])>
     </cfloop>
     <cfreturn result>
 </cffunction>

وكاختبار، أنا ألقى هذا معا:

ما يفعل، في الواقع، تعطيك فريد / سامي / فريد.

وانها ربما لا يكون التنفيذ الأكثر كفاءة، ولكن يمكنك دائما تغيير كود إدراج / اتحاد لجعله أسرع إذا أردت. في الغالب، كنت تهدف إلى كتابة التعليمات البرمجية أقل قدر ممكن من نفسي. : -)

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

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