0

現在、Webサーバーに2つのODBC接続を設定しています。1つはエンタープライズQADデータベースに接続し、もう1つはデータベースの拡張に使用されるカスタムデータベースに接続します。この特定の例では、QADデータベースに従業員レコードがあり、カスタムデータベースの別のテーブルに従業員番号があります。

phpで2つのodbc接続間にクロス結合を設定して、最初のクエリの結果をループし、返された結果に基づいていくつかのクエリを送信してレコードを結び付ける必要がないようにする方法はありますか? php配列?

私が思いついた最善の方法は、カスタムデータベースの最初のクエリからIN句を作成し、2番目のクエリをQADデータベースに送信してから、phpで配列マージを実行することです。ただし、これは通常のSQL結合と比較して非常に遅いプロセスです。

4

3 に答える 3

1

これに対する解決策が既に見つかっているかどうかはわかりませんが、これを行う方法に関する Progress の記事があります。

マルチデータベース ODBC 接続を設定するためのクイック ガイド

同様の要件がありました。プライマリ QAD データベースのテーブルとカスタム データベースのカスタム テーブルの間に結合を作成したかったのです。私はこれをテストしましたが、セットアップは少し異なりますが、うまく機能します。Microsoft SSRS から QAD に接続して、QAD データに対するレポートを作成する必要がありました。標準の QAD レポート デザイナーでは処理できないレポートを作成する必要がありました。

私はこれを Progress 10.1c でテストしました (この方法は 10.1b+ でのみサポートされています)。

したがって、私が取った手順は次のとおりです。

  1. プライマリ データベースとカスタム データベースに関連する記事に従って、oesql.properties 構成ファイルを作成します。
  2. クライアント マシン (私の場合は、SSRS を使用して SQL Server 2008 R2 を実行している Windows Server 2008 R2 マシン) で ODBC システム DSN を作成し、記事に従ってデータベース参照を追加します。
  3. ODBC DSN を使用して SQL Server にリンク サーバーを作成する
  4. OpenQuery 構文を使用して、リンク サーバー経由で QAD からデータを抽出するビューを作成します (私の場合、これは ReportServer データベースで作成されました)。
  5. ポイント 3 のビューをデータ ソースとして使用して、標準の T-SQL クエリを作成します。最終的に、これが私の SSRS レポートのデータソースになりました。

OS/データベースと ODBC ドライバーのビット バージョンが一致することが重要だと思いますが、まだ確認していません。

私の要件はあなたの要件とは異なりますが、最終的に重要なのは QAD サーバーの構成と ODBC のセットアップです。PHP クライアントが OpenQuery コマンドに関して同様の機能を実行できる限り、これを機能させることができます。私はPHPの経験がないので、あなたを助けることはできません.

少し複雑に見えますが、実際には非常にうまく機能し、多くの場合、QAD ブラウズを使用したデータのクエリよりもパフォーマンスが優れています。

お役に立てれば。

編集: OpenQuery コマンドのサンプルを次に示します。テーブルの結合が通常の方法で機能していることがわかりますが、テーブル参照に追加の要素が必要なだけです。

CREATE VIEW [dbo].[vQADData] AS SELECT * FROM OPENQUERY(LinkedServerName,
'
SELECT custTable.item_date AS DESP_DATE, so_mstr.so_site AS SITE, so_mstr.so_po AS PO_NO, so_mstr.so_inv_nbr AS INV_NO,
      ad_mstr.ad_name AS ADNAME, ad_mstr.ad_city AS ADCITY, ad_mstr.ad_state AS ADSTATE
FROM customdbname.pub.customtable custTable
INNER JOIN pub.so_mstr ON so_mstr.so_nbr = custTable.so_nbr
INNER JOIN pub.ad_mstr ON ad_mstr.ad_addr = so_mstr.so_ship
INNER JOIN pub.sod_det ON sod_det.sod_nbr = custTable.so_nbr
WHERE so_mstr.so_site = ''SiteName'' AND so_mstr.so_shipvia = ''SHIPPER'' AND custTable.item_date IS NULL
')

次に、通常の SQL 構文を使用してビューにアクセスします。

SELECT * FROM vQADData
于 2012-11-16T23:44:48.300 に答える
1

提案された解決策を提供してくれた Tiran に感謝します。Tiran が行っていたように、SQL サーバー経由で複数のテーブルを参照しようとしている人のために、追加の情報があります。

複数のソース (進行状況)、同じテーブル構造から同時にデータを取得し、データ ウェアハウス (SQL Server) に挿入しようとしています。だから私は、異なるデータベースで複数の同じ構造化テーブルの結合を試みているだけです。Tiran のソリューションは私を同じ道に導きましたが、Progress データベースのリンクは面倒なプロセスであり、これをまとめるために 2、3 日の自由時間 (彼の見積もり) を持つ Progress DBA を見つける必要がありました。Progress の担当者と直接話したところ、Progress 側で共用体を使用してビューを作成すると、ビュー内の各ソースからデータが同時にではなく順次抽出されることも指摘されました。しかし、これは私たちのニーズを解決し、Progress 側でテーブルをリンクする処理を完全にスキップするように見える別の発見につながりました。

3 つのソースと同じテーブルの例を次に示します (これはクロス ソース結合された異なるテーブルでも機能するはずです)。ここにあるすべての名前は、例をわかりやすくするために提供されています。

Source 1 - Table_A
Source 2 - Table_A
Source 3 - Table_A
  • source1 という名前のソース 1 への ODBC 接続を作成します。
  • source2 という名前の Source 2 への ODBC 接続を作成します。
  • source3 という名前の Source 3 への ODBC 接続を作成します。(注: 通常、接続設定を [Read Uncommitted] に設定する必要があります)。

SQL Server で、各ソースへのリンク サーバー接続を作成します。

ls_source1
ls_source2
ls_source3

Progress データベースを参照する必要がある SQL Server データベースで、ユニオンを使用して 3 つの異なるリンク サーバー接続を結合するビューを作成します。リンク サーバーの参照は、それぞれ openquery を使用する必要があります。各リンク サーバー ソースからの select * を使用するこの例では、すべての列が各ソースから同じ名前を付けられ、同じ構造になっていることを前提としています。

CREATE VIEW table_name_v as 
SELECT *
FROM 
(SELECT *
FROM OPENQUERY(ls_source1,
'select *
from source1.dbo.Table_A
')
union
SELECT *
FROM OPENQUERY(ls_source2,
'select *
from source2.dbo.Table_A
'
union
SELECT *
FROM OPENQUERY(ls_source3,
'select *
from source3.dbo.Table_A
'
)
) x

ビューが作成されたので、異なる Progress ソースの 3 つのテーブルすべてを同時にクエリできるようになりました。Progress 側での特別な設定は必要ありません。

私が現在回避策に取り組んでいるという重要な警告があります。64 ビット SQL Server を使用する 64 ビット マシンを使用している場合は、64 ビット ドライバーを使用して、リンク サーバー オプションで Progress データベースに接続する必要があります。私のニーズでは、同じマシン上に 32 ビットと 64 ビットの両方のドライバーが必要であり、同じマシン上で一緒にうまく動作しないように見えるため、問題が発生しました。64ビットと32ビットの両方のドライバーを同じマシンにインストールできました(そのドライバーのリンクを送信するはずのProgressのWebサイトに不具合がありましたが、誰かに正しい場所に案内してもらうことができました64 ビットの odbc ドライバーを取得します。平均的なユーザーは両方のドライバーを必要とせず、64 ビットのみを使用できます。別の回避策として、私が' 両方のドライバーを同じマシンに共存させることができません。Connx 社が、この問題を解決する 64 ビット/32 ビット ブリッジを提供するドライバーを提供していることを確認しました。ただし、理想的には、サードパーティのソフトウェアは必要ありません。

残念ながら、セットアップして使用していたリンクサーバーが正しく機能しなくなったため、新しい問題が発生しました。二歩進んで、一歩下がって……。

他の人が見ていると確信しているので、私の発見を共有したいと思いました。

于 2014-04-18T20:31:31.007 に答える
0

簡単な回答:JOIN 2 つの接続間でテーブルを作成することはできません。

シナリオ: (それらすべてを 1 つの接続で)

  • デフォルトでは、ほとんどのデータベースでは、次のように、テーブルの前にスキーマ名をプレフィックスとして付けることで、異なるスキーマのテーブルを結合できます。

(...) FROM defaultDB.TableA INNER JOIN extensionDB.TableA ON ({Condition}) (...)

  • データベースによっては (Progress DB についてはよくわかりません)、異なるサーバーのスキーマに属するテーブルを結合できない場合があります。

  • 異なるデータベース (例: Progress x MySQL) のテーブルを結合すると、さらに複雑になります。この最後のシナリオを実現できる (よくわからない) 独自のソリューションであるOracle Gatewayについて聞いたことがあります。

要約すれば:

あなたの状況が最初のシナリオ (最も明白なアプローチを指す) に当てはまらない場合、最短の解決策はコードをプロファイリングし、可能なパフォーマンスのボトルネックを最適化することだと思います。コードを並列処理に適応させることは、より大胆な改善になる可能性があります。

于 2012-10-22T19:50:33.117 に答える