1
DROP TABLE #ABC
CREATE TABLE #ABC (ID INT NOT NULL, Name VARCHAR (2) NOT NULL, name2 VARCHAR(2))
INSERT INTO #ABC (ID, NAME)
VALUES (1,'01'),(1,'F5'),(1,'05'),(1,'08'),(1,'02'), (1,'03'), (1,'04'), (1,'06'),(1,'07'),(1,'09'),(1,'10'),(1,'11'),(1,'12'),(1,'13'),(1,'14'),
(1,'15'),(1,'2D'),(1,'2E'),(1,'4B'),(1,'5F'),(1,'64'),(1,'73'),(1,'83'),(1,'88'),(1,'A9'),(1,'AC'),(1,'D0'),(1,'D7'),(1,'15'),(2,'76'),(2,'J5')

name2 の入力に使用しているスクリプト (動作していません)

UPDATE A
SET name2 = SUBSTRING(REPLACE(CONVERT(VARCHAR(36), NEWID()) , '-', ''), 0, 3)
FROM #ABC AS A

select * from #ABC

したがって、テーブル #ABC には既に ID と NAME が入力されています。「Name2」に入力して、「name2」が同じ ID の「name」と同じ値を持たないようにします。たとえば、 ID = 1 の場合、すべての name2 値は name 値とは異なる必要があります。ありがとう

4

1 に答える 1

0

SQL Server を使用しているようです。その場合、row_number()関数を使用して一意の識別子を の末尾に追加できnameます。

with toupdate as (
      select t.*, row_number() over (partition by id order by name desc) as num
      from #abc t
     )
update toupdate
    set name2 = cast(num as varchar(2))

これは、特定の ID に対して最大 99 個の重複に対して機能します。

残念ながら、現在 SQL Server を利用できません。しかし、ここにアイデアがあります。name の最大値を取得してから、基数 36 (26 の英字と 10 の数値) の算術演算を実行できます。結果は次のようになります。

with toupdate as (
      select t.*, row_number() over (partition by id order by name desc) as seqnum,
             max(name) over (partition by id) as maxname,
             ((case when left(name, 1) between '0' and '9'
                    then ascii(left(name, 1))
                    else ascii(upper(left(name, 1))) - ascii('A')+10
               end) * 36 +
              (case when right(name, 1) between '0' and '9'
                    then ascii(right(name, 1))
                    else ascii(upper(right(name, 1))) - ascii('A')+10
               end)
             ) as namenum
      from #abc t
     )
update toupdate
    set name2 = (case when (namenum+seqnum)/36 < 10
                      then char(ascii('0')+((namenum+seqnum)/36))
                      else char(ascii('A')+((namenum+seqnum)/36) - 10)
                 end)+
                (case when ((namenum+seqnum)%36) < 10
                      then char(ascii('0')+((namenum+seqnum)%36))
                      else char(ascii('A')+((namenum+seqnum)%36) - 10)
                 end)

これにより、最大の名前が検出され、それよりも大きな名前が生成されます。これは、英字 (大文字) と数字のみを使用していることを前提としています。name可能な最大値に近い値を取ると失敗する可能性があります ('ZZ'この場合)。

于 2013-05-08T00:25:59.620 に答える