0


私は行列を含む行列乗算プロジェクトを行っています
。これが私のテーブル形式です。

   create table A ( row integer, col integer, val integer);

私がする必要があるのは、各テーブルにデータを入力することです。
タスク1:200 * 200の行列Aを作成し、そのすべての要素を1に初期化します。
つまり、手動で
<0,0,1><0を挿入します。 1,1> <0,2,1>....<0,199,1>
挿入<1,0,1><1,1,1><0,2,1> ..... <1,199、 1>など

タスク2:200 * 200の行列Aを作成し、その対角要素は1です。

だから私はこれを手動で行う代わりに、とにかくすべての要素を自動初期化する方法があるのだろうかと思っていますか?
以下は、whileループを使用した試みです。

create table A ( row integer, col integer, val integer);
DECLARE @count INT
SET @count = 0
DECLARE @count2 INT
SET @count2 = 0
WHILE (@count < 200)
BEGIN
   WHILE (@count2 <200)
   BEGIN
      INSERT INTO A([row], [col]) VALUES (@count, @counts)
      SET @count2 = (@count2 + 1)
   END
   SET @count = (@count + 1)
END

これは上記の正しいですか?私はsqlにかなり慣れていません:(

4

1 に答える 1

2

ループや反復的なものは避けてください。あなたはSQLServerにいます-セットベースだと思います

これを試して

insert into A( row, col, val )
select row, col, 1
from 
(
        SELECT Row = number from master..spt_values 
        where type='P' and number between 1 and 200
) Rows
CROSS JOIN
(
        SELECT Col = number from master..spt_values 
        where type='P' and number between 1 and 200
) Cols

2番目の要件については、怠惰になって追加することができます

where Row = Col

それが1回限りのことであれば、これは問題ないはずです。

このmaster..spt_valuesビットは、1から200までの範囲の数値を取得することに関するものです。次のバリエーションも使用できます。

; WITH cte AS
  (
    SELECT n = number  FROM master..spt_values 
    WHERE type = 'P'  AND  number BETWEEN 1 AND 20
  ) 
INSERT INTO A ( row, col, val )
SELECT Rows.n, Cols.n, 1
FROM
    cte AS Rows
  CROSS JOIN
    cte AS Cols ;
于 2012-11-28T06:43:11.327 に答える