0

我有两个名为ComputerReportand的表SoftwareReport。在第一个表中,我添加了一个名为SFID. 我使用此列在第一个表和第二个表之间建立链接。第二个表也有一个名为 的列SFID,这也是表的主键。

我想要的是将SFID表格SoftwareReport中的SFID列填充到ComputerReport. 在下图中,您可以看到两个表,但中的SFIDComputerReportNULL

如何将SoftwareReport表中的 ID 填充到SFID列中,ComputerReport并且在程序名称不存在时应仅添加程序名称。

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

谢谢,

杰米

4

4 回答 4

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

SQL Fiddle 示例

于 2013-04-25T09:48:46.077 回答
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

如脚本中所示,您应该使用所需的列和值修改INSERT查询以获取额外的行。ComputerReport

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

于 2013-04-25T09:20:48.380 回答
0

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

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

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

于 2013-04-25T09:18:00.407 回答
0

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

于 2013-04-25T10:21:19.213 回答