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中用它做什么?