1

これがすでに尋ねられているかどうかはわかりません。かなり探し回ったのですが、何も見つかりませんでした。

私の最終結果は、いくつかの SQL データベース テーブルからコンマ区切りのフラット ファイルにデータを取得することです。通常、これは問題にはなりませんが、それらの多対 1 の関係と、私がそれを入れざるを得ないフォーマットのために、そうであることが証明されています。

1 つ目は、レポートのすべての基本情報を含む Report テーブルです。例えば

CREATE TABLE tblReportExample
(
    ReportID int,
    ReportMonth smalldatetime,
    ReportDetails varchar(500)
)

2番目に、各レポートのケースを含む別のテーブルがあります。

CREATE TABLE tblReportCasesExample
(
    ReportID int,
    ReportCase varchar(50)
)

3番目に、次のフラットファイル定義があります。

ReportID、ReportMonth、ReportDetails、ReportCase1、ReportCase2、ReportCase3

私がする必要があるのは、レポートの tblReportCasesExample から上位 3 つのケースを取得し、tblReportExample のデータと結合して、ReportCase1、2、および 3 としてフラット ファイルに追加することです。

私は一日中このことを見てきましたが、それを理解することはできません.

何か案は?

4

5 に答える 5

1

あなたの質問に対する提案された更新:「フラットファイル」だけでなく、「CSVファイル」。おそらく、CSV ファイルは別のシステムへのエクスポートか、Excel で物事を表示するのが好きな人へのエクスポートです :-)

古いタイマー (つまり、多くのファイル転送システム統合作業を行った人物) からの別のコメント: すべての世界が SQL データベースであるとは限りません。特に、タスクに「ACID」が必要ない場合 (最初の抽出に関するトランザクションを除く)。

2 つのテーブル (の関連部分) を 1 組の CSV ファイルにダンプします。次に、最終的な CSV ファイルを「手続き的に」組み立てます。Practical Extraction and Reporting Language (別名 "perl") は、この種の作業に適したツールですが、他にもあります。

「tblR​​eportCasesExample」データを何らかのインデックス付きデータ構造に読み込みます。

「tblR​​eportExample」データを反復処理します。

  • 「お気に入り」の tblReportCasesExample エントリを選択します

  • tblReportExample フィールドをダンプし、続いて関連する tblReportCasesExample 行/行からの選択 (キー) 値をダンプします。

データに特殊文字が含まれている場合は、CSV 処理ライブラリを見つけてください。それ以外の場合は、「分割」を使用してください (perl と Java の両方にこのような機能があります。.NET ライブラリにも同様の機能があると思われます)。

詳細/ケアが必要ですか?

于 2009-08-27T20:20:16.280 に答える
0

私はこれを MS SQL Server でテストしていませんが (smalldatetimeデータ型の使用から推測します) FOR XML PATH、.

SELECT r.*,
  (SELECT TOP 3 c.ReportCase + ',' AS [text()]
   FROM tblReportCasesExample c
   WHERE c.ReportId = r.ReportId
   FOR XML PATH('')
  ) AS ReportCaseList
FROM tblReportExample r;

結果には、tblReportExample の列に加えて、上位 3 つのレポート ケースのカンマ区切りの文字列が含まれている必要があります。その場合、おそらく CSV ファイルでは、一部のコンマが列を区切るのではなく、その文字列の一部であることがわかりません。:-)

于 2009-09-23T02:02:36.090 に答える
0

ケース テーブルにさらにケースを追加し、それらを区別するための ID を追加するだけです。

CREATE TABLE tblReportCasesExample
(
    CaseID int,
    ReportID int,
    ReportCase varchar(50)
)

私の混乱の原因は、テキストファイルが必要な理由ですか?

于 2009-08-26T15:20:05.427 に答える
0

ここで正しい ID を使用していることを確認してください。私はあなたが何を求めているのか混乱しています。

私が理解できるように、あなたの問題は次の2つのいずれかです。

1. 複数のケースへの単一のレポート ポイント ケースは複数のレポートに割り当てることができます

これには多対多の接続が必要です。

2. 単一のレポートが複数のケースを指す 単一のケースを単一のレポートに割り当てることができる

それは一対多です

2 点目で、何が問題を引き起こしているのかわかりません。詳しく説明してください。

于 2009-08-26T00:31:07.627 に答える
0

ケース テーブルの ReportID は、レポート テーブルの ReportID と同じです。シナリオ 2 は私の問題です。左外部結合で1つのケースを取得できますが、他の2つに到達するための創造的な方法を見つけることができません:

SELECT re.ReportID, re.ReportMonth, re.ReportDeails, rce.ReportCase 
FROM tblReportExample re 
LEFT OUTTER JOIN tblReportCasesExample rce 
ON(re.ReportID = rce.ReportID)
于 2009-08-26T13:58:06.570 に答える