【问题标题】:Update From with Case Statement使用案例声明更新自
【发布时间】: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 字段,不是吗?你确定你不是在尝试插入吗?
  • 你真的有两张桌子吗?或者这两个名字(MyNewTableMyOldTable)是同一张表?
  • Good catch @ypercube ... 乍一看,我没有意识到该语句正在调用看似两个表的语法,这意味着一个表。我已经用任何一种情况的解决方案更新了我的答案。

标签: sql sql-server sql-server-2008 tsql sql-update


【解决方案1】:

试试这个。我想我知道你想做什么。这将创建一个带有 IsMarried 标志而不是描述性值的新表。

告诉我。

MAC

 SELECT OLD.id
    ,   OLD.[Name]
    ,   CASE (OLD.MaritalStatus )
            WHEN 'Married' then 1
        ELSE
            0   
        END AS IsMarried
INTO dbo.newTable
FROM dbo.oldTable AS OLD

表格:

旧:

id  Name             MaritalStatus

1   Jack             Divorced  
2   Jill             Married   
3   James            Single    
4   Mark             Married   

新:

id  Name           IsMarried

1   Jack           0
2   Jill           1
3   James          0
4   Mark           1

【讨论】:

  • 是的,就是这个想法。我已经更新了上面的示例并尝试解释意图。
【解决方案2】:

您没有加入任何内部/外部查询。如果您在派生表(id)中返回另一个字段并加入它,您会没事的。您需要在添加额外的 id 字段之前结束您的案例陈述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多