1
 <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、2番目のステートメントはdatasource2(オラクルで) に属します。cfquery を使用して 2 つのステートメントを実行するにはどうすればよいですか?

4

3 に答える 3

4

両方のデータベースが Oracle の場合 (質問では明確ではありません)、データベース リンクを作成し、両方のデータベースを 1 つのデータベースとしてクエリできます。このリンクはオラクルで行われるため、「ColdFusion ソリューション」は必要ありません。Oracle には、データベースのリンクに関するドキュメントがあります。複数のデータベース内の情報へのアクセスと変更レガシー システムから新しいシステムへのデータ移行中に、これを数回使用しました。それはうまくいきます。insertupdate、およびも使用できます。delete

@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>
于 2013-04-05T11:18:03.440 に答える
2

これを行うにはいくつかの方法があります。1 つはクエリのクエリです。ただし、質問に基づいて、ユニオンクエリが必要かどうかは明確ではありません。次のようなものが必要になる場合があります。

クエリ 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 つの方法は、Henry が提案したとおりです。データベース 2 のテーブルを含むデータベース 1 のクエリを作成する方法はいくつかあります。実際、それらは同じタイプのデータベースである必要さえありません。たとえば、Sql Server にリンク サーバーをセットアップして、Oracle データベースにクエリを実行できます。ただし、構文は RDBMS に依存しており、独自のものを指定していません。

于 2013-04-05T09:33:45.103 に答える
0

短い答えは、できないということです。ただし、2 つの別々の CFQUERY を実行してから、結果を 3 番目の CFQUERY に結合し、UNION 操作を使用してクエリのクエリとして結合することができます (元の CFQUERY の両方の列が同等である限り)。ただし、表示したクエリに基づいて、最初のデータソースの結果から 2 番目のデータソースの結果を削除したいと考えています。これは、CFQUERY ステートメント内では実行できません。

于 2013-04-05T06:08:31.543 に答える