如何在T-SQL中正确更新2个表?

时间:2017-07-18 04:00:51

标签: sql-server tsql sql-server-2016

我发现2个表的每行数据非常不同。现在我只是想知道它们如何才能正确更新。我试图使用LIKE或CONTAINS但我不知道如何实现它们,因为数据是严格不同的单词或数据。希望你能帮助我。非常感谢你。

DECLARE @MyTable1 TABLE(Id int identity(1,1), LandId nvarchar(10), Block nvarchar(100), Floor nvarchar(10), Unit nvarchar(10), TransactionPrice nvarchar(100), SalePrice nvarchar(100), ActualSize nvarchar(100))

INSERT INTO @MyTable1 SELECT N'1', N'北翼 North Wing', N'2/F', N'B', N'4011177', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1', N'北翼 North Wing', N'2/F', N'C', N'5611194', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1', N'北翼 North Wing', N'2/F', N'D', N'4357460', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1', N'北翼 North Wing', N'3/F', N'B', N'3374514', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1', N'北翼 North Wing', N'3/F', N'C', N'4863924', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1', N'北翼 North Wing', N'3/F', N'D', N'3373659', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1', N'北翼 North Wing', N'3/F', N'E', N'4602343', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1', N'北翼 North Wing', N'5/F', N'B', N'3409569', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1', N'北翼 North Wing', N'5/F', N'C', N'5134571', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1', N'北翼 North Wing', N'5/F', N'D', N'3409569', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1', N'北翼 North Wing', N'5/F', N'E', N'4125204', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1', N'北翼 North Wing', N'6/F', N'B', N'3598611', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1', N'北翼 North Wing', N'6/F', N'C', N'5189044', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1', N'北翼 North Wing', N'6/F', N'D', N'3444624', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1', N'北翼 North Wing', N'6/F', N'E', N'4669060', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1',  NULL, N'15', N'C', N'27353000', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1',  NULL, N'15', N'B', N'28414000', N'0', N'0'
INSERT INTO @MyTable1 SELECT N'1',  NULL, N'15', N'A', N'25556000', N'0', N'0'

SELECT * FROM @MyTable1

DECLARE @MyTable2 TABLE(Id int identity(1,1), LandId nvarchar(10), Block nvarchar(100), Floor nvarchar(10), Unit nvarchar(10), TransactionPrice nvarchar(100), SalePrice nvarchar(100), ActualSize nvarchar(100))

INSERT INTO @MyTable2 SELECT N'1', N'南翼 South Wing', N'2樓 2/F', N'B', N'NULL', N'4082800', N'14793'
INSERT INTO @MyTable2 SELECT N'1', N'北翼 North Wing', N'2樓 2/F', N'C', N'NULL', N'6562800', N'18230'
INSERT INTO @MyTable2 SELECT N'1', N'北翼 North Wing', N'2樓 2/F', N'D', N'NULL', N'4586800', N'18130'
INSERT INTO @MyTable2 SELECT N'1', N'北翼 North Wing', N'3樓 3/F', N'B', N'NULL', N'3946800', N'14950'
INSERT INTO @MyTable2 SELECT N'1', N'北翼 North Wing', N'3樓 3/F', N'C', N'NULL', N'5688800', N'14662'
INSERT INTO @MyTable2 SELECT N'1', N'北翼 North Wing', N'3樓 3/F', N'D', N'NULL', N'3945800', N'14723'
INSERT INTO @MyTable2 SELECT N'1', N'北翼 North Wing', N'3樓 3/F', N'E', N'NULL', N'5153800', N'16106'
INSERT INTO @MyTable2 SELECT N'1', N'南翼 South Wing', N'5樓 5/F', N'B', N'NULL', N'4153800', N'15050'
INSERT INTO @MyTable2 SELECT N'1', N'南翼 South Wing', N'5樓 5/F', N'C', N'NULL', N'6770800', N'13989'
INSERT INTO @MyTable2 SELECT N'1', N'南翼 South Wing', N'5樓 5/F', N'D', N'NULL', N'7769800', N'14688'
INSERT INTO @MyTable2 SELECT N'1', N'南翼 South Wing', N'5樓 5/F', N'E', N'NULL', N'4836800', N'13252'
INSERT INTO @MyTable2 SELECT N'1', N'南翼 South Wing', N'6樓 6/F', N'B', N'NULL', N'4196800', N'15261'
INSERT INTO @MyTable2 SELECT N'1', N'南翼 South Wing', N'6樓 6/F', N'C', N'NULL', N'6840800', N'14134'
INSERT INTO @MyTable2 SELECT N'1', N'南翼 South Wing', N'6樓 6/F', N'D', N'NULL', N'7849800', N'14839'
INSERT INTO @MyTable2 SELECT N'1', N'北翼 North Wing', N'6樓 6/F', N'E', N'NULL', N'4914800', N'13728'
INSERT INTO @MyTable2 SELECT N'1', N'帝滙豪庭 Wellesley', N'15', N'C', N'NULL', N'39905000', '23000'
INSERT INTO @MyTable2 SELECT N'1', NULL, N'15', N'B', N'NULL', N'28414000', '24100'
INSERT INTO @MyTable2 SELECT N'1', N'帝滙豪庭 Wellesley', N'15', N'A', N'NULL', N'25556000', '22100'

SELECT * FROM @MyTable2

UPDATE 
    x
SET 
    x.Block = y.Block,
    x.SalePrice = y.SalePrice,
    x.ActualSize = y.ActualSize
FROM 
    @MyTable1 x
JOIN @MyTable2 y
    ON x.LandId = y.LandId
    AND (x.BLOCK = y.BLOCK OR (x.block IS NULL AND y.BLOCK IS NULL))
    AND x.FLOOR = y.FLOOR
    AND x.UNIT = y.UNIT


-- I want to achived table

1   1   北翼 North Wing   2/F B   4011177     4082800     14793
2   1   北翼 North Wing   2/F C   5611194     6562800     18230
3   1   北翼 North Wing   2/F D   4357460     4586800     18130
4   1   北翼 North Wing   3/F B   3374514     3946800     14950
5   1   北翼 North Wing   3/F C   4863924     5688800     14662
6   1   北翼 North Wing   3/F D   3373659     3945800     14723
7   1   北翼 North Wing   3/F E   4602343     5153800     16106
8   1   北翼 North Wing   5/F B   3409569     4153800     15050
9   1   北翼 North Wing   5/F C   5134571     6770800     13989
10  1   北翼 North Wing   5/F D   3409569     7769800     14688
11  1   北翼 North Wing   5/F E   4125204     4836800     13252
12  1   北翼 North Wing   6/F B   3598611     4196800     15261
13  1   北翼 North Wing   6/F C   5189044     6840800     14134
14  1   北翼 North Wing   6/F D   3444624     7849800     14839
15  1   北翼 North Wing   6/F E   4669060     4914800     13728
16  1   帝滙豪庭 Wellesley      15  C   27353000    39905000    23000
17  1   帝滙豪庭 Wellesley      15  B   28414000    28414000    24100
18  1   帝滙豪庭 Wellesley      15  A   25556000    25556000    22100

1 个答案:

答案 0 :(得分:0)

UPDATE x SET 
x.Block = (case when y.Block is null then N'帝滙豪庭 Wellesley'else x.block end) ,
x.SalePrice = y.SalePrice,
x.ActualSize = y.ActualSize FROM @MyTable1 x JOIN @MyTable2 y
ON x.Id = y.Id

您好,

  1. 我使用了一个case语句,它会将@ table1中的值更改为帝汇豪庭Wellesley,如果为null,则保持块名称相同。

  2. 我已经在id上加了表而不是landId。

  3. 希望这有帮助