SQL Server - 使用Order By更新整个列

时间:2018-04-10 07:32:33

标签: sql sql-server

如果这是相关的,我正在使用SQL Server并安装了Management Studio。

我想将一个表从一个表复制到另一个表,但问题是我必须复制的表需要以某种方式排序,因为这些表之间没有共同的标识我可以用来加入它们。

我读过这两个问题:

我尝试将他们的答案结合如下:

WITH cte AS
(
    -- I must specify TOP to use ORDER BY
    SELECT TOP(50000) *
    FROM TableToCopyTo
    ORDER BY ColumnUsedToOrder
)
UPDATE cte 
SET ColumnToCopyTo = (SELECT ColumnToCopyFrom FROM TableToCopyFrom)

当我尝试执行此查询时,它会返回以下错误:

  

Msg 512,Level 16,State 1,Line 1
  子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

我已尝试查找错误但无法找到相关信息。

我想了解为什么我的查询错误或找到替代方案来实现我正在寻找的东西。

3 个答案:

答案 0 :(得分:0)

如果您的TableToCopyFrom行数等于或大于TableToCopyTo,我可以使用以下内容:

WITH cte1 AS
(
  -- I must specify TOP to use ORDER BY
  SELECT TOP(50000) *
    , ROW_NUMBER() OVER (ORDER BY ColumnUsedToOrder) AS RwNr
  FROM TableToCopyTo
  ORDER BY ColumnUsedToOrder
), cte2 AS (
  SELECT *
    , ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RwNr -- or order by a column you know makes sense; this way it'll order it the way the data "sits" in the table, but it's not guaranteed
  FROM TableToCopyFrom
)
UPDATE cte1
SET ColumnToCopyTo = ColumnToCopyFrom
FROM cte1
  INNER JOIN cte2 ON cte1.RwNr = cte2.RwNr;

编辑:请确保首先在数据库的某个副本上测试此逻辑。

答案 1 :(得分:0)

尝试以下答案。您必须为两个表提供匹配的列。

;WITH cte AS
(
-- I must specify TOP to use ORDER BY
SELECT TOP(50000) *
FROM TableToCopyTo
ORDER BY ColumnUsedToOrder
)
UPDATE cte SET ColumnToCopyTo = ColumnToCopyFrom
FROM cte
JOIN TableToCopyFrom A
ON cte.ColumnName = A.EquvaliantColumnName

答案 2 :(得分:0)

您可以使用行号作为密钥,如下所示

    WITH tblDest AS
    (

    SELECT Row_Number() over(order by ColumnUsedToOrder) as RowNum, TOP(50000) *
    FROM TableToCopyTo
    ORDER BY ColumnUsedToOrder
    ),tblSrc as
    (
    select  Row_Number() over(order by (select null)) as RowNum,ColumntoCopyFrom 
    from TableToCopyFrom
    )

   update tblDest set ColumntoCopyto = ColumntoCopyFrom  
   FROM tblDest join tblSrc on tblDest.RowNum = tblSrc.RowNum