Coldfusion 如何在没有qoq的情况下连接来自不同数据库的两个查询?
我有两个不同的问题Coldfusion 如何在没有qoq的情况下连接来自不同数据库的两个查询?,coldfusion,Coldfusion,我有两个不同的问题 <cfquery datasource="#one#" name="GetResults"> SELECT ID, Account, Value FROM Logger_Events left join Event_Details on ID = EventID where type = '123' </cfquery> <cfquery datasource="#
<cfquery datasource="#one#" name="GetResults">
SELECT ID, Account, Value
FROM Logger_Events
left join Event_Details
on ID = EventID
where type = '123'
</cfquery>
<cfquery datasource="#two#" name="getSubtotal">
select account from daily
</cfquery>
选择ID、帐户、值
从Logger\u事件
左加入事件\u详细信息
on ID=EventID
其中type='123'
从每日帐户中选择帐户
第一个查询给我大约200条记录,第二个查询给我大约200条记录
50万张唱片
有没有办法让第二个查询从第一个查询中获取记录,
不进行查询?
我将使用account列加入
这些表位于不同的服务器中。这是QoQ的原因之一。您可以运行第一个查询,然后将数据转换为XML,并将其作为参数传递给第二个DB服务器上的存储过程,以便直接在DB上过滤第二个查询。只需连接到XML或使用XML填充临时表。这是QoQ的原因之一。您可以运行第一个查询,然后将数据转换为XML,并将其作为参数传递给第二个DB服务器上的存储过程,以便直接在DB上过滤第二个查询。只需连接到XML或使用XML填充临时表。由于您使用的是sql server,我建议使用链接服务器。选择一台服务器,并设置与另一台服务器的链接服务器。然后设置一个存储过程来执行类似的操作
declare #TempTable table (field1 datatype1, etc);
insert into #TempTable (field1, field2, etc)
select field1, field2, etc
from openquery
(linkedServerName,
'select field1, field2 etc
from blah blah blah
')
select yourfields
from #TempTable join aTableInThatDB on etc
细节一开始有点痛苦,但效果很好。另外,internet上有很多关于链接服务器和openquery的信息。由于您使用的是sql server,我建议使用链接服务器。选择一台服务器,并设置与另一台服务器的链接服务器。然后设置一个存储过程来执行类似的操作
declare #TempTable table (field1 datatype1, etc);
insert into #TempTable (field1, field2, etc)
select field1, field2, etc
from openquery
(linkedServerName,
'select field1, field2 etc
from blah blah blah
')
select yourfields
from #TempTable join aTableInThatDB on etc
细节一开始有点痛苦,但效果很好。此外,internet上还有大量关于链接服务器和openquery的信息。我使用此函数将表的外键替换为外部表中包含的文本字段。这可以使用QueryAddColumn()和QuerySetCell()将新列附加到原始查询 其思想是将其中一个查询转换为结构。 我的功能非常基本,但目前看起来是这样的:
<cffunction name="joinNameFromIDStructs" returnType="query" hint="Returns the Fund Activity">
<cfargument name="qryMain" type="query" required="Yes" hint='The query which is going to be translated' >
<cfargument name="foreignTable" type="string" required="Yes" hint='table which contains the details of our foreign column' >
<cfargument name="foreignPK" type="string" required="No" default="#arguments.foreignTable#ID" hint="Primary Key in the foreign table" >
<cfargument name="foreignKey" type="string" required="Yes" hint="column in the main table which references another table" >
<cfargument name="foreignText" type="string" required="Yes" hint="the column in the foreing table which hold the required details. It will override the foreign key column in the main table" >
<cfset var idPK = "">
<cfset var qryForeignTable = "">
<cfset var stForeignTable = StructNew()>
<cfset var listForeignPKs = evaluate("ValueList(arguments.qryMain.#arguments.foreignKey#)")/>
<cfif ListLen(listForeignPKs)>
<cfquery name="qryForeignTable" datasource='#application.siteDataSource#' >
SELECT #arguments.foreignPK#, #arguments.foreignText# FROM #arguments.foreignTable#
WHERE #arguments.foreignPK# IN (<cfqueryparam cfsqltype="cf_sql_integer" value='#arrayToList(listToArray(listForeignPKs))#' list="true" />) <!--- CF8 does not support ListRemoveDuplicates , hence we will use the array conversion to remove empties --->
</cfquery>
<cfloop query='qryForeignTable'>
<cfset stForeignTable[qryForeignTable[arguments.foreignPK][qryForeignTable.currentrow]] = qryForeignTable[arguments.foreignText][qryForeignTable.currentrow]/>
</cfloop>
<cfloop query='arguments.qryMain'>
<cfset idPK = arguments.qryMain[arguments.foreignKey]/>
<cfif idPK neq "">
<cfset arguments.qryMain[arguments.foreignKey][arguments.qryMain.currentrow] = stForeignTable[idPK]/>
</cfif>
</cfloop>
</cfif>
<cfreturn arguments.qryMain/>
</cffunction>
选择#arguments.foreignPK#、#arguments.foreignText#FROM#arguments.foreignTable#
其中#arguments.foreignPK#IN()
我执行此功能是为了将表的外键替换为外部表中包含的文本字段。这可以使用QueryAddColumn()和QuerySetCell()将新列附加到原始查询
其思想是将其中一个查询转换为结构。
我的功能非常基本,但目前看起来是这样的:
<cffunction name="joinNameFromIDStructs" returnType="query" hint="Returns the Fund Activity">
<cfargument name="qryMain" type="query" required="Yes" hint='The query which is going to be translated' >
<cfargument name="foreignTable" type="string" required="Yes" hint='table which contains the details of our foreign column' >
<cfargument name="foreignPK" type="string" required="No" default="#arguments.foreignTable#ID" hint="Primary Key in the foreign table" >
<cfargument name="foreignKey" type="string" required="Yes" hint="column in the main table which references another table" >
<cfargument name="foreignText" type="string" required="Yes" hint="the column in the foreing table which hold the required details. It will override the foreign key column in the main table" >
<cfset var idPK = "">
<cfset var qryForeignTable = "">
<cfset var stForeignTable = StructNew()>
<cfset var listForeignPKs = evaluate("ValueList(arguments.qryMain.#arguments.foreignKey#)")/>
<cfif ListLen(listForeignPKs)>
<cfquery name="qryForeignTable" datasource='#application.siteDataSource#' >
SELECT #arguments.foreignPK#, #arguments.foreignText# FROM #arguments.foreignTable#
WHERE #arguments.foreignPK# IN (<cfqueryparam cfsqltype="cf_sql_integer" value='#arrayToList(listToArray(listForeignPKs))#' list="true" />) <!--- CF8 does not support ListRemoveDuplicates , hence we will use the array conversion to remove empties --->
</cfquery>
<cfloop query='qryForeignTable'>
<cfset stForeignTable[qryForeignTable[arguments.foreignPK][qryForeignTable.currentrow]] = qryForeignTable[arguments.foreignText][qryForeignTable.currentrow]/>
</cfloop>
<cfloop query='arguments.qryMain'>
<cfset idPK = arguments.qryMain[arguments.foreignKey]/>
<cfif idPK neq "">
<cfset arguments.qryMain[arguments.foreignKey][arguments.qryMain.currentrow] = stForeignTable[idPK]/>
</cfif>
</cfloop>
</cfif>
<cfreturn arguments.qryMain/>
</cffunction>
选择#arguments.foreignPK#、#arguments.foreignText#FROM#arguments.foreignTable#
其中#arguments.foreignPK#IN()
您能举个例子吗?我记得很久以前问过您是否可以在ColdFusion中传递表值参数。我认为你做不到。可能会发送一个长json字符串或xml,并在存储过程中执行一些字符串操作,将其打包为表值参数。您能举个例子吗?我记得很久以前问过您是否可以在ColdFusion中传递表值参数。我认为你做不到。可能会发送一个长json字符串或xml,然后在存储过程中进行一些字符串操作,将其打包为表值参数。哪个dbms?此外,500K记录还有很多数据需要收回。它最终是如何使用的?确切地说,sql server 2012是289437条记录,我夸大(编辑)了XML,这听起来是一个合理的选择。另一种可能性是。还有很多数据。只是好奇,您最终在CF中使用它做什么?哪个dbms?此外,500K记录还有很多数据需要收回。它最终是如何使用的?确切地说,sql server 2012是289437条记录,我夸大(编辑)了XML,这听起来是一个合理的选择。另一种可能性是。还有很多数据。只是好奇,你最终在CF中用它做什么?