如何根据不同表的结果集更新表中的列?

时间:2012-09-11 20:10:05

标签: sql tsql

这与我想要做的一致:

UPDATE [table1]
SET FirstName IN (SELECT [FirstName] FROM [table2]) 

我需要在[table1]上更新300个名称,名称在[table2]中。这些名字是NULLS。它们需要是[table2]的名称。

记录集可以是随机的。因此表之间不需要任何关系。

我将如何做到这一点?

3 个答案:

答案 0 :(得分:3)

忽略丢失的关系,排序问题或任何可能导致数据不准确的问题,您可以尝试这样做,任意分配行号到两个表中的每个记录,并将这两个表与该数字一起匹配,然后根据该匹配更新名称字段:

WITH Source AS 
(
    SELECT 
        Name, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RowNum
    FROM 
        [Table2]
), 
Destination AS 
(
    SELECT 
        Name, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RowNum
    FROM 
        [Table1] 
)
UPDATE 
    d
SET 
    d.Name = s.Name
FROM 
    Source s
JOIN 
    Destination d 
    ON 
    s.RowNum = d.RowNum

但是:没有让一个表与另一个表相关的具体内容,最终可能会将源表中的300个名称复制到目标表中随机化的300行中。< / p>


编辑:根据您对想要随机数据的评论,如果您将ROW_NUMBER()列更改为:

ROW_NUMBER() OVER (ORDER BY (SELECT NEWID()))

你会真正得到一些随机数据。

答案 1 :(得分:2)

  

我需要300个名字来填充[table1]和   名称在[table2]中。

填充意味着插入,然后这工作:

INSERT INTO table1
    SELECT FirstName FROM table2;

以下是一个示例:http://sqlfiddle.com/#!3/0d2f4/1/0

答案 2 :(得分:1)

如果您只是尝试在表1中创建新记录,请执行以下操作:

insert into Table1 (FirstName)
select FirstName from Table2

如果您需要更新记录,请执行以下操作:

update t1
   set FirstName = t2.FirstName,
       LastName  = t2.LastName
  from Table1 t1
  join Table2 t2 on t1.ID = t2.ID   -- (or whatever key you are using to join the two tables)