替换删除更新MS SQL

时间:2017-04-18 06:38:28

标签: sql sql-server

嗨我有一张大桌子,我做了两张小桌子:

TABLE BIG

NAME    SURNAME    Id_columnX 
tata    grgr            
moto    hjjj              
oto     kono              
majs    grgsgr      35666      
msdfo   hjgfjj      27166      
odato   kogsno      21899   


TABLE 1

NAME  SURNAME Id_columnX NAME2
tata  grgr               gtata
moto  hjjj               hmoto
oto   kono               koto


TABLE 2

NAME   SURNAME   Id_columnX    NAME2
majs    grgsgr      35666      grmajs
msdfo   hjgfjj      27166      hjmsdfo
odato   kogsno      21899      koodato

我在2个小桌子上做了这样的脚本:

TABLE 1

DELETE FROM TABLE1
 WHERE Id_columnX  LIKE '_%'

Update TABLE1
    set NAME = RIGHT(CONCAT( REPLICATE('0', 6),  ( NAME ) ), 6)
    where LEN( + RTRIM ( NAME ) )  < 6;

UPDATE  [dbo].[TABLE1]
SET [NAME2] = LEFT([SURNAME], 2) + [NAME]

UPDATE [dbo].[TABLE1]
SET [NAME2]=LOWER(LEFT([NAME2],1))+LOWER(SUBSTRING([NAME2],2,LEN([NAME2])))




TABLE 2

DELETE FROM TABLE2 
 WHERE Id_columnX  NOT LIKE '_%'

Update [dbo].[TABLE2]
    set NAME = RIGHT(CONCAT( REPLICATE('0', 7),  ( NAME ) ), 7)
    where LEN( + RTRIM ( NAME ) )  < 7;

UPDATE  [dbo].[TABLE2]
SET [NAME2] = LEFT([SURNAME], 1) + [NAME]

UPDATE [dbo].[TABLE2]
SET [NAME2]=LOWER(LEFT([NAME2],1))+LOWER(SUBSTRING([NAME2],2,LEN([NAME2])))

我的问题是:我怎么能得到这个:

TABLE BIG


NAME   SURNAME   Id_columnX    NAME2
tata    grgr                   gtata
moto    hjjj                   hmoto
oto     kono                   koto
majs    grgsgr      35666      grmajs
msdfo   hjgfjj      27166      hjmsdfo
odato   kogsno      21899      koodato

我不想为2个小表分割大表,然后设置来自DELETE的NAME2集......我不知道我能用什么:如果更新?

感谢您的意见。

2 个答案:

答案 0 :(得分:0)

;WITH TABLE_BIG(NAME,SURNAME,Id_columnX )
AS
(
SELECT 'tata'  ,  'grgr'   ,     NULL    UNION ALL
SELECT 'moto'  ,  'hjjj'   ,     NULL    UNION ALL  
SELECT 'oto'   ,  'kono'   ,     NULL    UNION ALL  
SELECT 'majs'  ,  'grgsgr' ,     35666   UNION ALL   
SELECT 'msdfo' ,  'hjgfjj' ,     27166   UNION ALL   
SELECT 'odato' ,  'kogsno' ,     21899   
)
,TABLE1(NAME,SURNAME,Id_columnX, NAME2)
As
(
SELECT 'tata' , 'grgr' ,NULL, 'gtata'  UNION ALL
SELECT 'moto' , 'hjjj' ,NULL, 'hmoto'  UNION ALL
SELECT 'oto'  , 'kono' ,NULL, 'koto'
)
,TABLE2(NAME,SURNAME,Id_columnX,NAME2)
AS
(
SELECT 'majs'   , 'grgsgr',35666 ,'grmajs'    UNION ALL
SELECT 'msdfo'  , 'hjgfjj',27166 ,'hjmsdfo'   UNION ALL
SELECT 'odato'  , 'kogsno',21899 ,'koodato'
)
,Final AS (
        SELECT SURNAME,NAME2  FROM TABLE1       
        UNION ALL       
        SELECT SURNAME,NAME2  FROM TABLE2
        )

SELECT NAME ,SURNAME,Id_columnX ,NAME2
FROM (
    SELECT B.NAME
        ,b.Id_columnX
        ,f.SURNAME
        ,f.NAME2
    FROM Final F
    INNER JOIN TABLE_BIG B ON b.SURNAME = f.SURNAME
    ) AS Dt

答案 1 :(得分:0)

在UPDATE时,只需在WHERE子句中包含所有必要条件,如下所示:

UPDATE [Big]
SET name = RIGHT(CONCAT( REPLICATE('0', 6),  ( name ) ), 6)
    WHERE Id_columnX NOT LIKE '_%' AND LEN(RTRIM(name)) < 6;

然后

UPDATE [Big]
SET name = RIGHT(CONCAT( REPLICATE('0', 7),  ( name ) ), 7)
    WHERE Id_columnX LIKE '_%' AND LEN(RTRIM(name)) < 7;

我不确定条件是否应该是WHERE Id_columnX(NOT)LIKE'_%'或WHERE Id_columnX IS(NOT)NULL。无论如何对表1和表2中的记录进行分类都应该适用于选择性更新。

运行两个查询后,表格应该完全更新。