如何在CFQUERY中使用两个DataSource

时间:2013-04-05 05:51:33

标签: coldfusion

 <cfquery name="checkinvoice" datasource="?">
    SELECT DISTINCT INVOICE_DATE,DEPARTMENT,VALUE,INVOICE_NO 
    FROM   ro_invoice 
    WHERE  sheet_no='#newROSheet.sheetNo#'
    MINUS
    SELECT DISTINCT INVOICE_DATE,DEPARTMENT,VALUE,INVOICE_NO 
    FROM   dbowner.rs_invoices 
    WHERE  rs_id ='#recordSheet.id#'
</cfquery>

在上面的代码中,第一个select语句属于datasource1,第二个属于datasource2(在oracle中)。我如何使用cfquery来执行这两个语句?

3 个答案:

答案 0 :(得分:4)

如果两个数据库都是Oracle(在您的问题中不明确),您可以创建数据库链接并查询两个数据库,就像它们是一个一样。此链接在oracle中完成,因此不需要“ColdFusion解决方案”。 Oracle提供了有关链接数据库的文档。 Accessing and Modifying Information in Multiple Databases我们在从旧系统到新系统的数据迁移过程中多次使用过这种方法。它运作良好。您还可以使用insertupdatedelete

使用@dblink语法将表格链接起来很容易。

<cfquery ...>
    select
        a.column1
      , b.column2
    from
      someTable@dblinkName a -- I came from the linked database
      inner join someOtherTable b on b.someColumn = a.someColumn
</cfquery>

答案 1 :(得分:2)

有几种方法可以做到这一点。一个是查询查询。但是,根据您的问题,不清楚联合查询是否是您想要的。你可能想要这样的东西:

查询1

select yourfields
, concat(your fields together, casting as string where necessary) concatfield
etc

查询2与查询1相同,但来自其他数据库。查询3是

select yourfields
from Query1
where concatfield not in (<cfqueryparam 
    value="#ValueList(Query2.concatfield#" list="yes">

另一种方式是亨利建议的。有一些方法可以从数据库1中编写包含数据库2中的表的查询。事实上,它们甚至不必是相同类型的数据库。例如,您可以在Sql Server上设置链接服务器并查询oracle数据库。但是,语法取决于RDBMS,您没有指定自己的语法。

答案 2 :(得分:0)

简短的回答是,你不能。但是,您可以执行两个单独的CFQUERY,然后将结果作为查询查询与UNION操作连接在第三个CFQUERY中(只要两个原始CFQUERY中的列都是等效的)。但是,根据您显示的查询,您希望从第一个数据源的结果中删除第二个数据源的结果。这不能在CFQUERY语句中完成。