0

一見簡単そうに見えますが、ここで立ち往生しています。VS2010、C#環境を使用しています。

つまり、基本的に、テーブル「masses」を含むデータベースがあります。このテーブルには、列「mass」が含まれています(値のタイプはdoubleです)。各行について、「mass」が特定の行PLUS 21の「mass」の値に等しいすべてのレコードを検索する必要があります。これらの結果のレコードを、同じデータベースの既存のテーブルに配置します。

SQLで実行できますか、それとも反復を使用してこれを実行する必要がありますか?

4

2 に答える 2

1

inステートメントを使用してこれを行うことができます。

INSERT INTO SomeOtherTable (<columns you want>)
SELECT <columns you want>
FROM   Masses
WHERE  Mass IN (SELECT mass + 21
                FROM   masses)

別の方法として、次のように書くこともできますEXISTS:

INSERT INTO SomeOtherTable (<columns you want>)
SELECT <columns you want>
FROM   Masses
WHERE  EXISTS
(
    SELECT NULL
    FROM   masses M
    WHERE  Masses.Mass = M.Mass + 21 
)

または派生テーブルを使用します。

INSERT INTO SomeOtherTable (<columns you want>)
SELECT <columns you want>
FROM   Masses
       INNER JOIN (SELECT Mass + 21 AS NewMass
                   FROM   masses) AS NewMasses
         ON NewMasses.NewMass = Masses.Mass
于 2013-01-30T12:12:43.050 に答える
-1

カーソルを使用してテーブルを反復処理できます。カーソルは、行の列の値を SQL 変数に割り当てることができます。次に、すべての行に対してフィルタリングを行い、結果で必要なものを作成します。

-- Create a cursor that iterates through the table and only reads the 'mass' column
DECLARE C1 CURSOR FOR 
SELECT mass FROM masses
DECLARE @current decimal

OPEN C1

-- Copy the value from the 'mass' column to a vaiable
FETCH NEXT FROM C1 INTO @current

WHILE @@fetch_status = 0
BEGIN

    -- Select the rows that have mass = current row mass + 21
    SELECT * -- This ca be improved by selecting only the rows you need
    FROM masses
    WHERE mass = @current + 21

    FETCH NEXT FROM C1 INTO @current
END
CLOSE C1
DEALLOCATE C1

ネストされた選択では、次の行を変更するなどして、すべての行を宛先テーブルにコピーできます。

INSERT INTO DESTINATION_TABLE(row1, row2, ..., rown)
SELECT (row1, row2, ..., rown)
FROM masses
WHERE mass = @current + 21
于 2013-01-30T12:20:23.847 に答える