如果这是相关的,我正在使用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。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
我已尝试查找错误但无法找到相关信息。
我想了解为什么我的查询错误或找到替代方案来实现我正在寻找的东西。
答案 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