2012-12-14 1 views
5

私はIdDatoLegal列を更新する必要が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] 
) 

今、このテーブルを持っています。今はそのテーブルに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. 

私は、サブクエリで(BY ROW_NUMBER()OVER(ORDERを選択ので、だと思いますIdCliente)AS RowNum FROM DatosLegales)それは1つだけを返すべきであるところで80行を返します(ただし、別の番号でなければなりません)。

サブクエリはそれを動作させるには?そしてとりわけ、ループとその他の手順は正しいのですか?事前

+0

は、SQL Serverを使用していますか? – luchosrock

+0

@luchosrock - 構文、角括弧区切り文字、およびエラーメッセージは、SQL Serverを示しています(おそらく、Sybaseには同じエラーメッセージが表示されます)。 –

答えて

18

おかげであなたは以下のようにCTEを使用して1文のすべての行を更新することができます。

;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

Join backベーステーブルに貼り付けます。この計画は、結合とスプールを追加するため効率が悪いです。 –

+0

ああ、私はちょうど同じような質問を別の方法で尋ねた。あなたの答えのビットは私を混乱させる。 – Kaf

関連する問題