어떻게 사용할 수 있습니 query-of-쿼리 UNION n-레코드 집합을 때 var 범위 지정이 필요합니까?

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

  •  20-08-2019
  •  | 
  •  

문제

나는 다음과 같이 할 수 있는 쿼리를 쿼리를 알 수없는 수의 레코드 집합.그러나 할 경우 쿼리의 쿼리는 점 또는 브래킷에서 허용되지 않는 레코드 집합 이름입니다.

예를 들어 이것은 실패합니다.

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

를 사용하여 동적 변수 이름과 같이"recordset1"이 작동하지만 이 함수에서 요 var 범위의 할 수 있도록 구축한 변수 이름을 동적으로 생산하지 않고 메모리 누수에서 지속적인 개체입니다.

다른 어떤 아이디어가?

도움이 되었습니까?

해결책

어려운 작업. 나는 중첩 루프가있는 솔루션을 상상할 수 있습니다. GetColumnNames(), 사용 QueryAddRow() 그리고 QuerySetCell(). 가장 효율적인 것은 아니지만 실제로 느리지 않습니다. 물론 작업의 크기에 따라 다릅니다.

"두 개의 레코드 세트를 결합한 함수 만들기"는 10 개의 인수를 수락하기 위해 그것을 만들 때 훨씬 더 효율적일 수 있습니다. 즉시 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>

다른 팁

질문을 게시 한 후 나는 몇 가지 솔루션을 생각해 냈지만 거기에 더 나은 솔루션이있을 수 있습니다.

  • 인수 범위에 동적으로 명명 된 변수를 작성한 다음 쿼리의 범위없이 참조 할 수 있습니다.

  • 2 개의 레코드 세트를 인수로 받아들이고 하나의 결합 된 레코드 세트를 반환하는 함수를 만듭니다. 한 번에 레코드 세트를 점차적으로 추가하기 위해 반복 될 수 있습니다. 나는 이것이 하나의 쿼리에서 모든 노조를 수행하는 것과 비교할 때 매우 비효율적이라고 확신합니다.

약간의 찌그러진 후, 나는 이것을 발견했다.QueryConcat cflib.org에서. QueryAddrow/QuerySetCell을 사용하여 두 쿼리를 연결합니다.

빠른 기능을 추가했습니다 (오류 확인 또는 데이터 검증이 없으므로 AS-IS를 사용하지 않습니다).

<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>

시험으로, 나는 이것을 함께 던졌습니다.

실제로 Fred/Sammy/Fred를 제공합니다.

아마도 가장 효율적인 구현은 아니지만 항상 삽입/통합 코드를 변경하여 원하는 경우 더 빨리 만들 수 있습니다. 대부분, 나는 가능한 한 작은 코드를 직접 작성하는 것을 목표로하고있었습니다. :-)

의 모든 솔루션을 추가한 여기에 작동해야한다,그러나 나는 것 또한 언급하는 데이터의 양에 따라 당신이 노력하고 있습니다 그리고 데이터베이스를 사용하여,당신이 할 수 있는 방법을 찾기 위해 노력하고 이를 데이터베이스에 대한 측.매우 큰 기록 설정,그것이 도움이 될 수 있습니다를 쓰는 기록을 임시 테이블을 선택 그들을 다시지만,어느 방법으로 할 수 있다면 어떤 방식으로 재작성하는 쿼리하게 데이터베이스에 핸들이 첫 번째 장소에서 당신은 더욱 나아질 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top