【发布时间】:2012-04-20 23:21:10
【问题描述】:
我正在尝试使用第一个表中的数据更新表。我正在尝试写这样的东西:
-- Create the temp tables
DROP TABLE #MyNewTable
CREATE TABLE #MyNewTable
(
UserId int IDENTITY(1, 1)
NOT NULL,
MarriedFlag bit NOT NULL
)
DROP TABLE #MyOldTable
CREATE TABLE #MyOldTable
(
UserId int IDENTITY(1, 1)
NOT NULL,
Married nvarchar(50) NULL
)
-- Insert test values
INSERT INTO #MyOldTable
([Married])
VALUES ('married'),
('married'),
('not married'),
('maybe married')
GO
-- First pass will do nothing as there is no data in #MyNewTable
UPDATE #MyNewTable
SET [MarriedFlag] = CASE I.[Married]
WHEN 'married' THEN 1
ELSE 0
END
FROM [#MyOldTable] AS I,
[#MyOldTable] AS O
WHERE I.[UserId] = O.[UserId]
-- Will insert 4 values into #MyNewTable
SET IDENTITY_INSERT [#MyNewTable] ON
INSERT INTO #MyNewTable
([UserId],
[MarriedFlag])
SELECT I.[UserId],
CASE I.[Married]
WHEN 'married' THEN 1
ELSE 0
END
FROM [#MyOldTable] AS I
WHERE I.[UserId] NOT IN (SELECT [UserId]
FROM [#MyNewTable])
SET IDENTITY_INSERT [#MyNewTable] OFF
SELECT *
FROM [#MyOldTable]
-- #MyOldTable Expected Output
UserId Married
1 married
2 married
3 not married
4 maybe married
SELECT *
FROM [#MyNewTable]
-- #MyNewTable Expected Output
UserId MarriedFlag
1 1
2 1
3 0
4 0
还有一点需要注意的是,这是触发器的一部分。这个想法是当旧表更新时,新值被清除,如果它们有效,则将其插入到新表中。
【问题讨论】:
-
只告诉我们“no go”意味着回答这个问题的“no go”。
-
您遇到错误了吗?什么是marriedflag 类型?
-
您的表需要一个 JOINing 字段,不是吗?你确定你不是在尝试插入吗?
-
你真的有两张桌子吗?或者这两个名字(
MyNewTable和MyOldTable)是同一张表? -
Good catch @ypercube ... 乍一看,我没有意识到该语句正在调用看似两个表的语法,这意味着一个表。我已经用任何一种情况的解决方案更新了我的答案。
标签: sql sql-server sql-server-2008 tsql sql-update