2

これが私の状況です:

表 1 には、ID を一意の識別子として使用する一連のデータが含まれています。このテーブルには、そのような他の約 6 つのテーブルとの 1 対多の関係があります。

テーブル 1 の ID が 001 の場合: テーブル 2 には外部キーを持つ 3 つの行がある可能性があります: 001 テーブル 3 には外部キーを持つ 12 行がある可能性があります: 001 テーブル 4 には外部キーを持つ 0 行がある可能性があります: 001 テーブル 5 には外部キーを持つ 28 行がある可能性があります: 001

指定された期間のテーブル 1 のすべての行と、それを参照するいくつかのテーブルに含まれるすべてのデータをリストするレポートを作成する必要があります。

擬似コードでの私の現在のアプローチは次のようになります。

select * from table 1
foreach(result) {
  print result;
  select * from table 2 where id = result.id;
  foreach(result2) {
    print result2;
  }
  select * from table 3 where id = result.id
  foreach(result3) {
    print result3;
  }
  //continued for each table
}

これは、1 つのレポートを 1000 クエリの近隣で実行できることを意味します。これが過剰であることはわかっていますが、私の sql-fu は少し弱く、助けが必要です。

4

8 に答える 8

3

Table1 の LEFT OUTER JOIN Tables2-N

SELECT Table1.*, Table2.*, Table3.*, Table4.*, Table5.*
FROM Table1
LEFT OUTER JOIN Table2 ON Table1.ID = Table2.ID
LEFT OUTER JOIN Table3 ON Table1.ID = Table3.ID
LEFT OUTER JOIN Table4 ON Table1.ID = Table4.ID
LEFT OUTER JOIN Table5 ON Table1.ID = Table5.ID
WHERE (CRITERIA)
于 2008-09-19T15:42:23.450 に答える
2

参加は私のためにそれをしません。クライアント側でデータのもつれを解く必要がありません。左結合からのすべてのヌル。

これは、結合を使用しないセットベースのソリューションです。

INSERT INTO @LocalCollection (theKey)
SELECT id
FROM Table1
WHERE ...


SELECT * FROM Table1 WHERE id in (SELECT theKey FROM @LocalCollection)

SELECT * FROM Table2 WHERE id in (SELECT theKey FROM @LocalCollection)

SELECT * FROM Table3 WHERE id in (SELECT theKey FROM @LocalCollection)

SELECT * FROM Table4 WHERE id in (SELECT theKey FROM @LocalCollection)

SELECT * FROM Table5 WHERE id in (SELECT theKey FROM @LocalCollection)
于 2008-09-19T15:50:41.293 に答える
1
SELECT * FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.resultid -- this could be a left join if the table is not guaranteed to have entries for t1.id
INNER JOIN table2 t3 ON t1.id = t3.resultid -- etc

または、データがすべて同じ形式である場合は、実行できます。

SELECT cola,colb FROM table1 WHERE id = @id
UNION ALL
SELECT cola,colb FROM table2 WHERE resultid = @id
UNION ALL
SELECT cola,colb FROM table3 WHERE resultid = @id

これは、レポートに出力するためにデータを必要とする形式によって異なります。

あなたがどのように出力を望むかのサンプルを与えることができれば、私はおそらくもっと助けることができます。

于 2008-09-19T15:47:44.437 に答える
1

ああ!手続き的!最初のテーブルの結果の後に他のテーブルの結果を並べ替える必要がある場合、私の SQL は次のようになります。

Insert Into #rows Select id from Table1 where date between '12/30' and '12/31'
Select * from Table1 t join #rows r on t.id = r.id
Select * from Table2 t join #rows r on t.id = r.id
--etc

結果を初期 ID でグループ化する場合は、前述のように左外部結合を使用します。

于 2008-09-19T15:42:50.283 に答える
1

Crystal や Jasper などのレポート ツールを使用することをお勧めします。大胆な場合は、XSL-FO を使用することをお勧めします。これらには、特にこれを処理するためのものが組み込まれています。これは、生の SQL でうまく機能するものではありません。

すべての行 (ヘッダーとすべての詳細) の形式が同じである場合、ストアド プロシージャとして実行するのも非常に簡単です。

私がすること: 結合として実行すると、すべての行にヘッダー データが表示されます。次に、レポート ツールを使用してグループ化を行います。

于 2008-09-19T15:43:29.423 に答える
0

私がすることは、次のクエリでカーソルを開くことです。

SELECT * from table1 order by id
SELECT * from table1 r, table2 t where t.table1_id = r.id order by r.id
SELECT * from table1 r, table3 t where t.table1_id = r.id order by r.id

そして、これらのカーソルを並行して歩き、結果を出力します。すべてが同じ順序で表示されるため、これを行うことができます。(table1 のプライマリ ID に idという名前を付けても、他のテーブルにはその名前がないことをお勧めします。)

于 2008-09-19T15:51:45.317 に答える
0

すべてのテーブルを結合します。

select * from table_1 left join table_2 using(id) left join table_3 using(id);

次に、コードで列をロールアップして、適切と思われるレポートの書式を設定します。

于 2008-09-19T15:44:10.030 に答える
0

すべてのテーブルは同じ形式ですか? そうでない場合は、nさまざまな種類の行を表示できるレポートが必要です。同じ列にのみ関心がある場合は、簡単です。

ほとんどのデータベースには、何らかの形式の動的 SQL があります。その場合、次のことができます。

create temporary table from
select * from table1 where rows within time frame

x integer
sql varchar(something)
x = 1
while x <= numresults {
 sql = 'SELECT * from table' + CAST(X as varchar) +  ' where id in (select id from temporary table'
 execute sql
 x = x + 1
}

ただし、基本的にここでは、メイン テーブルで 1 つのクエリを実行して必要な行を取得し、サブ テーブルごとに 1 つのクエリを実行して、メイン テーブルに一致する行を取得します。

レポートで各テーブルに同じ 2 つまたは 3 つの列が必要な場合は、 を に変更しselect * from tablexinsert into、最後に単一の結果セットを取得できます...

于 2008-09-19T15:56:43.837 に答える