어떻게 사용할 수 있습니 query-of-쿼리 UNION n-레코드 집합을 때 var 범위 지정이 필요합니까?
-
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를 제공합니다.
아마도 가장 효율적인 구현은 아니지만 항상 삽입/통합 코드를 변경하여 원하는 경우 더 빨리 만들 수 있습니다. 대부분, 나는 가능한 한 작은 코드를 직접 작성하는 것을 목표로하고있었습니다. :-)
의 모든 솔루션을 추가한 여기에 작동해야한다,그러나 나는 것 또한 언급하는 데이터의 양에 따라 당신이 노력하고 있습니다 그리고 데이터베이스를 사용하여,당신이 할 수 있는 방법을 찾기 위해 노력하고 이를 데이터베이스에 대한 측.매우 큰 기록 설정,그것이 도움이 될 수 있습니다를 쓰는 기록을 임시 테이블을 선택 그들을 다시지만,어느 방법으로 할 수 있다면 어떤 방식으로 재작성하는 쿼리하게 데이터베이스에 핸들이 첫 번째 장소에서 당신은 더욱 나아질 것입니다.