Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于表中的每一行,返回包含值+21的所有行(使用SQL)_C#_Sql - Fatal编程技术网

C# 对于表中的每一行,返回包含值+21的所有行(使用SQL)

C# 对于表中的每一行,返回包含值+21的所有行(使用SQL),c#,sql,C#,Sql,这似乎很容易,但我在这里被绊倒了。我使用的是VS2010,C环境 所以,基本上,我们有一个包含大量表的数据库。此表包含“质量值类型为双精度”的列。对于每一行,我必须找到质量等于特定行中质量值加21的所有记录。并将这些结果记录放入同一数据库中的现有表中 这可以由SQL完成,还是我必须使用迭代来完成?您可以使用in语句来完成 INSERT INTO SomeOtherTable (<columns you want>) SELECT <columns you want> FR

这似乎很容易,但我在这里被绊倒了。我使用的是VS2010,C环境

所以,基本上,我们有一个包含大量表的数据库。此表包含“质量值类型为双精度”的列。对于每一行,我必须找到质量等于特定行中质量值加21的所有记录。并将这些结果记录放入同一数据库中的现有表中


这可以由SQL完成,还是我必须使用迭代来完成?

您可以使用in语句来完成

INSERT INTO SomeOtherTable (<columns you want>)
SELECT <columns you want>
FROM   Masses
WHERE  Mass IN (SELECT mass + 21
                FROM   masses)
或使用派生表:

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

您可以使用游标在表中进行迭代。 游标可以将行中列的值分配给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

为了说清楚。。。你打算在哪里为每一行做准备?C端还是SQL端???是的,使用纯SQL很容易做到,这里有一些例子:我使用了foreach row方法,我会在几分钟内发布代码。@JosipMiller根据经验,很少需要通过迭代逐行执行任何操作-这不是数据库的设计目的!谢谢你的提示我想还有更多的SQL需要学习。我没有尝试使用Declare关键字,但我会的。谢谢这意味着我们必须为表中的每条记录建立+21的值。@JosipMiller请进一步解释。是否要更新每条记录,将21条添加到每个质量中?表质量中没有更新。我们需要在表mass中搜索每行的值mass+21。例如,如果第2行中的质量=22,则我们在表中搜索质量值为43的行。我们为每一行都这样做。之后,我们将找到的记录放入现有的表中。这看起来非常优雅,谢谢在同一个应用程序中,我已经使用连接来搜索数据,但是现在我没有考虑这个方法。在我看来,这可能是解决问题的办法。好的,我会尝试一下,然后回复给你。谢谢你的回答。我必须研究一下这个方法,但看起来可能会有帮助。不客气。我会对代码多加一点注释,让它更容易理解。哇!用一把大锤敲开这里的螺母。这个问题可以用一些简单的SQL来解决。
INSERT INTO DESTINATION_TABLE(row1, row2, ..., rown)
SELECT (row1, row2, ..., rown)
FROM masses
WHERE mass = @current + 21