2012-12-14 37 views
5

我有这个表,现在如何通过Row_Number更新每列的不同值的列?

CREATE TABLE [dbo].[DatosLegales](
    [IdCliente] [int] NOT NULL, 
    [IdDatoLegal] [int] NULL, 
    [Nombre] [varchar](max) NULL, 
    [RFC] [varchar](13) NULL, 
    [CURP] [varchar](20) NULL, 
    [IMSS] [varchar](20) NULL, 
    [Calle] [varchar](100) NULL, 
    [Numero] [varchar](10) NULL, 
    [Colonia] [varchar](100) NULL, 
    [Pais] [varchar](50) NULL, 
    [Estado] [varchar](50) NULL, 
    [Ciudad] [varchar](50) NULL, 
    [CodigoPostal] [varchar](10) NULL, 
    [Telefono] [varchar](13) NULL, 
    [TipoEmpresa] [varchar](20) NULL, 
    [Tipo] [varchar](20) NULL, 
CONSTRAINT [PK_DatosLegales] PRIMARY KEY CLUSTERED 
(
    [IdCliente] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) 

我需要更新IdDatoLegal列。现在我在该表上有80行,所以我需要用数字1,2,3 ... 79,80来更新每一行。

我试过简单的查询存储过程,根本没有成功。

我有这个商店的程序现在:

​​

它,当我运行返回此消息时,它

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

我想这是因为在子查询(SELECT ROW_NUMBER)OVER(ORDER BY( IdCliente)AS RowNum FROM DatosLegales)它返回80行,它应该只返回一个(但每次它应该是一个不同的数字)

你知道我必须添加到子查询使其工作?最重要的是,循环和程序的其余部分是否正确?

在此先感谢

+0

您使用的是SQL Server吗? – luchosrock

+0

@luchosrock - 语法,方括号分隔符和错误消息指示SQL Server(尽管可能是Sybase,如果它具有相同的错误消息,我想)。 –

回答

18

您可以使用CTE更新一个语句中的所有行如下。

;WITH T 
    AS (SELECT IdDatoLegal, 
       Row_number() OVER (ORDER BY IdCliente) AS RN 
     FROM dbo.DatosLegales) 
UPDATE T 
SET IdDatoLegal = RN 
+0

有点困惑:这是否更新'DatosLegales'? – Kaf

+1

是的。 CTE的行为类似于可更新视图,并且它会被转换回基表列的更新。 –

+0

很高兴知道。此外,这个更新说,IdCliente = 56,IdDatoLegal = 56(RN)。? – Kaf

5
UPDATE D 
SET IdDatoLegal = RN 
FROM DatosLegales D JOIN 
(
    SELECT IdCliente, Row_number() OVER (ORDER BY IdCliente) AS RN 
    FROM DatosLegales 
) Temp 
ON D.IdCliente = Temp.IdCliente 
+0

没有必要加入返回到基台上。这个计划效率不高,因为它增加了连接和一个线轴。 –

+0

好吧,我刚刚在其他方面提出了类似的问题。你的回答让我困惑。 – Kaf