0

文字列を連結して集計データを作ることについて意見を求めたい。列集計があるが、集計列で連結したい場合、どちらがパフォーマンスの面で高速ですか? 1 つの SQL を実行してから、CODE に集計します。または、メイン データを選択してから、一度に 1 つずつクエリを実行します。

例えば:

TABLE_A        
COL_A_1         COL_A_2
A               a
B               b
C               c

TABLE_B
COL_B_1         COL_B_2
a               Text1
a               Text2
a               Text3
b               Text4
b               Text5

テーブルは COL_A_2 = COL_B_1 で結合され、集計列は COL_B_2 です。

オプション 1 (1 つの SQL を実行)

SELECT TABLE_1.COL_A_1, TABLE_1.COL_A_2, TABLE_2.COL_B_2 
FROM TABLE_A 
LEFT OUTER JOIN TABLE_B ON TABLE_A.COL_A_2 = TABLE_2.COL_B_1
ORDER BY TABLE_1.COL_A_1

次にコードで、結果セットをループして COL_B_1 を集計します。(例: Java を使用)

String oldColA1 = "";
InfoEntity currInfo = null;
for (InfoEntity info : infoList) {
  if (!oldColA1.equals(info.colA1)) {
    currInfo = info;
  }

  if (currInfo.colB2 == null || currInfo.colB2.equals("")) {
    currInfo.colB2 = info.colB2;
  } else {
    currInfo.colB2 += info.colB2;
  }
  oldColA1 = info.colA1;
}

オプション 2 (複数の SQL を実行)

SELECT TABLE_1.COL_A_1, TABLE_1.COL_A_2
FROM TABLE_A 
ORDER BY TABLE_1.COL_A_1

次に、コード内でそれぞれを選択します(Ex Java)

for (InfoEntity info : infoList) {
  // Select TableB entity based on info.colA2
  ...
  tableBList = dao.selectTableB(info.colA2);
  ...
  for (TableBEntity b : tableBList) {
    info.colB2 += b.colB2;
  }
}

複数のSQLを選択するとコストがかかる可能性があるため、通常はオプション1を実行します。しかし、これについてはよくわかりません。しかし、この種の集計を行う別の方法はありますか。私はすでにネットを検索しており、標準SQLには文字列連結集計はありません。また、TableA の図は単純化しすぎています。通常、TableA は複数のテーブルを結合した複雑なクエリであり、TableB も同様です。

4

1 に答える 1

3

複数の SQL を選択するとコストがかかると思うので、通常はオプション 1 を実行します。

その通りです。データベースへのアクセスはできるだけ少なくする必要があります。

ただし、グループ連結は可能です。MySQL にはGROUP_CONCATがあり、4.1 以降です。SQL Server では、以下を使用できます。

SELECT @out = COALESCE(@out + ',' + t.column, t.column)
  FROM TABLE t

Oracle 9i+ で動作する例については、このリンクを確認してください。

于 2009-11-11T02:22:33.667 に答える