5

次のことを行うには、1 つのクエリを作成する必要があります。1) 同じサーバー上で 2 つの (informix) SQL テーブルを結合します (既に完了/動作中)。

サンプル コードでは、databaseA で tableA と tableB を使用し、databaseB で tableC を使用します。

同じデータベース上の 2 つのテーブルを結合することは問題ありません。

SELECT tableA.columnA
       tableB.columnA
FROM
       tableA
JOIN
       tableB
ON
       tableB.columnSHARED = tableA.columnSHARED
WHERE
       ([where clauses are inconsequential for this])

今、私がうまくいかないように見えるのは、データベースBのテーブルCの2番目のJOIN句です。すべてのテーブル/列参照にデータベース名の接頭辞を付けようとしましたが、うまくいかないようです。

明確にするために、両方のデータベースが同じサーバー上にあり、これらのコマンドを実行しているユーザーは両方のデータベースにアクセスできます。エラー メッセージを表示しますが、行 X の文字位置 Y (3 番目の結合句) の近くにエラーがあるという事実以外に、Informix から返される有用な情報は何もありません。共通のリンクもあります:

databaseB.tableC.columnSHARED

databaseB.tableCと に参加するにdatabaseA.tableAはどうすればよいdatabaseA.tableBですか?


編集 2: レスポンダーの新しいサニタイズ クエリ:

SELECT FIRST 100 
    tableA.sharedColumn, 
    tableA.colA, 
    tableA.colB, 
    tableA.colC, 
    tableA.colD, 
    tableA.colE, 
    tableA.colF, 
    tableA.colG, 
    tableB.colA ,
    databaseB:tableC.column
FROM 
    tableA 
JOIN 
    tableB 
ON 
    tableB.sharedColumn = tableA.sharedColumn 
LEFT OUTER JOIN 
    databaseB:tableC 
ON 
    databaseB:tableC.sharedColumn = databaseA:tableA.sharedColumn 
WHERE 
    {where clauses}
4

1 に答える 1

5

現在のデータベースが 2 つのテーブルを保持するデータベースであると仮定すると、次のように記述できます。

SELECT A.ColumnA,
       B.ColumnB,
       C.ColumnC
  FROM tableA AS A
  JOIN tableB AS B ON B.columnSHARED = A.columnSHARED
  JOIN databaseB:tableC AS C ON C.columnSHARED = A.ColumnSHARED
 WHERE ([…where clauses are inconsequential for this…])

テーブル名の完全な表記は次のとおりです。

[database[@server]:][owner.]tablename

したがって、次のように書くこともできます。

SELECT A.ColumnA,
       B.ColumnB,
       C.ColumnC
  FROM databaseA:tableA AS A
  JOIN databaseB:tableB AS B ON B.columnSHARED = A.columnSHARED
  JOIN databaseB:tableC AS C ON C.columnSHARED = A.ColumnSHARED
 WHERE ([…where clauses are inconsequential for this…])

これは、現在のデータベースがどのデータベースであるかに関係なく、現在のサーバーで正しく機能します。

この回答は、データベースのログ モードが同じであることを前提としています。そうでない場合は、データベース間結合を実行できません。

于 2015-10-05T20:48:34.207 に答える