1

3 つのテーブルがA BありCます。のすべてのエントリA x B(x はデカルト積または交差結合) に対して、 にエントリがありCます。

つまり、 に 2 つのエントリと に 3つのエントリがある場合、 のテーブルはC次のようになります。AB

| A_ID | B_ID | C_Val |
----------------------|
|  1   |  1   |  100  |
|  1   |  2   |  56   |
|  1   |  3   |  19   |
|  2   |  1   |  67   |   
|  2   |  2   |  0    |
|  2   |  3   |  99   |

したがって、 と の任意の組み合わせについてABで検索する値がありますC。これがすべて理にかなっていることを願っています。

実際にはA x B、データベースのサイズは比較的小さいかもしれませんが、データをテストするために手動で入力するには大きすぎます。したがって、およびCに既に存在する可能性のあるデータについて、 のテーブルにランダムにデータを入力したいと思います。AB

SQL に関する私の知識はかなり基本的なものです。これまでにできると判断したことは、そのデカルト積を次のように内部クエリとして取得することです。

(SELECT B.B_ID, C.C_ID
 FROM B CROSS JOIN C)

次に、次のようなことを言いたいと思います。

INSERT INTO A(B_ID, C_ID, A_Val) VALUES
    (SELECT B.B_ID, C.C_ID, FLOOR(RAND() * 100)
     FROM B CROSS JOIN C)

当然のことながら、これは機能しません。その場で列を生成したり、テーブル全体を値として挿入しようとしたりする有効な構文はないと思います。

基本的に、この通常のプログラミング擬似コードを適切な SQL に変換するにはどうすればよいですか?

foreach(A_ID in A){
    foreach(B_ID in B){
        C.insert(A_ID, B_ID, Rand(100));
    }
}
4

3 に答える 3

3

構文の問題は次の理由によるものです。

INSERT INTO A(B_ID, C_ID, A_Val) VALUES
  (SELECT B.B_ID, C.C_ID, FLOOR(RAND() * 100)
   FROM B CROSS JOIN C)

次のようにする必要があります。

INSERT INTO A(B_ID, C_ID, A_Val) 
  SELECT B.B_ID, C.C_ID, FLOOR(RAND() * 100)
   FROM B CROSS JOIN C;

VALUES( とは併用しませんINSERT/SELECT。)

ただしRAND()、すべての行に対して評価されないという問題がまだあります。すべての行で同じ値になります。B_ID と C_ID の組み合わせが一意であると仮定すると、次のようなものを使用できます。

INSERT INTO A(B_ID, C_ID, A_Val) 
  SELECT B.B_ID, C.C_ID, ABS(CHEKSUM(RAND(B.B_ID*C.C_ID))) % 100
   FROM B CROSS JOIN C;
于 2012-07-23T14:55:13.493 に答える
2
select A_id,B_Id, abs(checksum(newid()))%101 as C_val from A cross join B

これにより、範囲0から100のさまざまな値が得られます

于 2012-07-23T14:56:54.813 に答える
0

CTE を使用

  With cte as
  (SELECT B.B_ID, C.C_ID, ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) as A_Val
    FROM B CROSS JOIN C) 
  Insert into Table(B_ID, C_ID, A_Val)
  Select B_ID,C_ID,A_Val from cte

rand は同じ数値を生成するため、 NEWID を使用できます。ソース

于 2012-07-23T14:55:53.717 に答える