【问题标题】:How do I swap column values in sql server 2008?如何在 sql server 2008 中交换列值?
【发布时间】:2010-11-16 20:25:31
【问题描述】:

我有一张名为 Employee 的表

 Eno     ename     AttributeValue      AttributeName  
 1       aa           a123             abc
 2       bbb          b123             dcf
 3       cc           c7sd             wew3

我想将AttributeValue 列中的数据交换到AttributeNameAttributeNameAttributeValue

例如:

Eno     ename     AttributeValue   AttributeName  
1       aa        abc              a123
2       bbb       dcf              b123
3       cc        wew3             c7sd

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:
    UPDATE employee
    SET AttributeValue = AttributeName, 
        AttributeName = AttributeValue
    

    但是,除非两列具有完全相同的定义,否则您可能会丢失信息。

    【讨论】:

    • "除非两列具有完全相同的定义,否则您可能会丢失信息。" - 只是为了确定,你是说除非两列是相同的数据类型,否则我们可以丢失信息?或者你的定义是什么意思?谢谢
    • @VoodooChild - 数据类型,是的。虽然这包括相关的精度和大小。
    • 不敢相信这么简单。从 C++ 的思维方式出发,我的大脑一直在说“不……那行不通。这两个值最终都将是 AttributeName 的初始值。”
    • @druciferre 这是声明式编程。说出你想要的,而不是如何完成它。
    • C++ 方法让我快要死了,这太棒了!好简单哇!
    【解决方案2】:
    Update employee
    Set attributeValue = attributeName,
        attributeName = attributeValue
    

    【讨论】:

      【解决方案3】:

      update Employee set AttributeValue = AttributeName, AttributeName = AttributeValue

      【讨论】:

        【解决方案4】:

        对于大表来说,所有以前的技术都很慢,它们移动数据而不是重命名列,这是一个简单的解决方案:

        ALTER TABLE "amplitude"
        RENAME COLUMN "start_hour_displayed" TO "temp";
        
        ALTER TABLE "amplitude"
        RENAME COLUMN "start_hour" TO "start_hour_displayed";
        
        ALTER TABLE "amplitude"
        RENAME COLUMN "temp" TO "start_hour";
        

        如果您有链接的功能视图,您必须在之前备份它们并在之后恢复它们。

        【讨论】:

          【解决方案5】:

          这是一个很好的例子

          SELECT * from employees;
          Go
          
          DECLARE @temp as varchar(20)
          update employees
          set    @temp = fname,
                 fname = lname,
                 lname = @temp
          WHERE  deptno = 10;
          GO
          
          SELECT * from employees;
          

          【讨论】:

          • 你能解释一下这种行为吗?数据库引擎是否首先将fname 分配给@temp,然后将lname 分配给fname,然后将@temp 分配给lname?如果是这样,你如何解释set a=b, b=a
          • 你为什么要这样做?您不需要交换变量,请查看 Oded 的答案。
          【解决方案6】:
          Declare @myTable Table (id int, first_name varchar(50), last_name varchar(50));
          
          Select * from Student
          
          Insert Into @myTable (id, first_name, last_name) Select id, last_name, first_name from Student
          
              MERGE
              INTO    Student std
              USING @myTable tmp
              ON std.id = tmp.id
              WHEN MATCHED THEN
              UPDATE
              SET std.first_name = tmp.first_name,
              std.last_name = tmp.last_name;
          
          Select * from Student
          

          输出

          【讨论】:

            【解决方案7】:

            只需在一次更新中交换两列:

            Update registration
            Set AttributeName = AttributeValue ,
                AttributeValue = AttributeName where id in (1,2,3)
            

            【讨论】:

              【解决方案8】:

              更新员工 SET AttributeValue = AttributeName, AttributeName = AttributeValue 它不正确最好创建一个临时列并尝试代码 更新员工 SET temp=属性名 然后再一次 更新员工 SET AttributeName = AttributeValuee 再次

              更新员工 SET AttributeValuee= temp

              【讨论】:

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