我有两个名为ComputerReport
和SoftwareReport
的表。在第一个表中,我添加了一个名为SFID
的整数列。我使用此列在第一个和第二个表之间建立链接。第二个表还有一个名为SFID
的库,这也是该表的主键。
我想要的是将表格SFID
中的SoftwareReport
列填充到SFID
的{{1}}列中。在下图中,您会看到两个表格,但ComputerReport
中的SFID
列为ComputerReport
。
如何将NULL
表格中的ID填入SoftwareReport
的{{1}}列,并且只有在程序名称不存在时才添加。
以下是图片的链接:http://i33.tinypic.com/2usewr8.jpg
谢谢,
杰米
答案 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
如脚本中所示,您应该使用所需的列和值修改INSERT
中ComputerReport
额外行的{{1}}查询。
请注意,与常规(基于集合)的查询相比,基于游标的脚本速度较慢。 参考文献:
答案 2 :(得分:0)
如果我得到了您想要正确实现的内容,则必须将CRID添加到SoftwareReport表中并从ComputerReport中删除SFID。
然后,当您添加新软件报告时,您将使用上次报告中的CRID ...
这是有效的,你想实现这个目的: 每次运行检查时,它都会创建新的计算机报告,并在发生连接时将新软件添加到公共列表中,换句话说,哪个计算机报告报告了新软件。
答案 3 :(得分:0)
我真的不太了解问题。很抱歉,如果我的答案无关紧要。据我所知,你想要连接电脑和软件。为此你需要多对多的关系。因为一台软件可以在几台计算机上,一台计算机可以有多台软件。要实现这一点,您需要另一个由两列组成的表: ComputerSoftware(CID,SFID)。 例如,如果id为1的计算机具有id为2和3的软件,则应插入 (1,2)和(1,3)到ComputerSoftware表。