如何从另一列填充列?

时间:2013-04-25 08:06:20

标签: c# sql wpf visual-studio-2010

我有两个名为ComputerReportSoftwareReport的表。在第一个表中,我添加了一个名为SFID的整数列。我使用此列在第一个和第二个表之间建立链接。第二个表还有一个名为SFID的库,这也是该表的主键。

我想要的是将表格SFID中的SoftwareReport列填充到SFID的{​​{1}}列中。在下图中,您会看到两个表格,但ComputerReport中的SFID列为ComputerReport

如何将NULL表格中的ID填入SoftwareReport的{​​{1}}列,并且只有在程序名称不存在时才添加。

以下是图片的链接:http://i33.tinypic.com/2usewr8.jpg

谢谢,

杰米

4 个答案:

答案 0 :(得分:2)

如果您的逻辑只是用软件报告表中的第一项更新第一台计算机报告,第二项是第二项,第三项是第三项,依此类推,那么这对您有用:

WITH CR AS
(   SELECT  CRID, Name, SFID, rn = ROW_NUMBER() OVER(ORDER BY CRID) 
    FROM    ComputerReport
), SF AS
(   SELECT  SFID, Name, rn = ROW_NUMBER() OVER(ORDER BY SFID)
    FROM    SoftwareReport
)
MERGE INTO CR
USING SF
    ON sf.rn = cr.rn
WHEN MATCHED THEN 
    UPDATE SET SFID = sf.SFID
WHEN NOT MATCHED THEN
    INSERT (Name, SFID) VALUES (sf.Name, sf.sfID);

如果是SFID,这只是用软件表中的相应行更新计算机报告表。如果软件报告表中有其他行,它将向计算机报告表中添加一个新行,以便行计数匹配

<强> Example on SQL Fiddle

答案 1 :(得分:1)

通常,您应该在ComputerReport中插入一行,并且已经确定了SFID,而不是更新已插入的行。

INSERT INTO ComputerReport
(SFID, CrComputerName, CrLastUpdatedBy) -- add other columns as neeeded 
SELECT SFID, 'JAMI-HP', 'JAMIE-HP\JAMIE'
FROM SoftwareReport

如果表中没有任何有价值的内容,您可以截断ComputerReport表并执行上面的插入。

否则,您需要一个光标跟随每个表,并根据光标位置第一个表中SFID的值,在光标位置的第二个表中设置SFID

在理想情况下,您刚刚创建了行,两个表中都没有间隙,并且它们都包含相同的行数,因此我们可以简单地写:

UPDATE ComputerReport 
SET SFID = CRID

但在一般情况下,我们必须使用更复杂的脚本:

DECLARE @sfid, @crid

DECLARE sfcursor READONLY
FOR SELECT SFID
    FROM SoftwareReport
    WHERE SFName IS NOT NULL
    ORDER BY SFID ASC;
DECLARE crcursor
FOR SELECT CRID
    FROM  ComputerReport
    -- WHERE SFID IS NULL
    ORDER BY CRID ASC
FOR UPDATE SFID;

OPEN sfcursor;
OPEN crcursor;

FETCH NEXT FROM sfcursor INTO @sfid;
FETCH NEXT FROM crcursor INTO @crid;

-- update for each rows until we reach the end of either cursor
WHILE @@FETCH_STATUS = 0
     BEGIN
     UPDATE crcursor SET SFID = @sfid;
     FETCH NEXT FROM sfcursor INTO @sfid
     FETCH NEXT FROM crcursor INTO @crid
     END

-- if there are remaining rows in sfcursor, insert new rows in ComputerReport

FETCH RELATIVE 0 FROM sfcursor INTO @sfid
WHILE @@FETCH_STATUS = 0
    BEGIN
    INSERT INTO ComputerReport (SFID) -- you should add the other columns here as needed
    VALUES (@sfid);
    FETCH NEXT FROM sfcursor INTO @sfid
    END

CLOSE crcursor
CLOSE sfcursor
DEALLOCATE sfcursor
DEALLOCATE crcursor

如脚本中所示,您应该使用所需的列和值修改INSERTComputerReport额外行的{{1}}查询。

请注意,与常规(基于集合)的查询相比,基于游标的脚本速度较慢。 参考文献:

答案 2 :(得分:0)

如果我得到了您想要正确实现的内容,则必须将CRID添加到SoftwareReport表中并从ComputerReport中删除SFID。

然后,当您添加新软件报告时,您将使用上次报告中的CRID ...

这是有效的,你想实现这个目的: 每次运行检查时,它都会创建新的计算机报告,并在发生连接时将新软件添加到公共列表中,换句话说,哪个计算机报告报告了新软件。

答案 3 :(得分:0)

我真的不太了解问题。很抱歉,如果我的答案无关紧要。据我所知,你想要连接电脑和软件。为此你需要多对多的关系。因为一台软件可以在几台计算机上,一台计算机可以有多台软件。要实现这一点,您需要另一个由两列组成的表: ComputerSoftware(CID,SFID)。 例如,如果id为1的计算机具有id为2和3的软件,则应插入 (1,2)和(1,3)到ComputerSoftware表。