【问题标题】:Copy one column value to another将一列值复制到另一列
【发布时间】:2013-05-15 11:06:46
【问题描述】:

我有一个包含以下值的表

 sno     package  id
 66      250     111
 66       0      100
 66       0      99
 66       0      88
 67      270     225
 67      267     111
 67      0       35
 68      230     111
 68      225     250
 68      0       210

现在我想要的是 package 的值为 0 将 package 的值放在 id 为 111 的位置,即 66:250,67:267,68:230

以下结果

sno    value     id    
66     250      111
66     250      100
66     250      99
66     250      88
67     270      225
67     267      111
67     267      35  
68     230      111
68     225      250
68     230      230
68     230      210

我正在应用一些查询,例如

select sno, case age when 0 then (select age from table1 where id=111 )
                     else 1 end as age, ID from table1

这个内部子查询提供了多个值,我也不能使用 sno 将其作为硬编码。 怎么可能做到?请帮助使用groupby clause 或一些joins 或cursor。

谢谢

【问题讨论】:

  • 对于每个 sno 的降序 ID,较低的值是否始终为零?

标签: sql sql-server join group-by cursor


【解决方案1】:

试试这个:

SELECT sno
      , CASE WHEN age = 0 
             THEN (SELECT age FROM table1 t1 
                    WHERE t1.id=111
                      AND t1.sno = t2.sno ) 
             ELSE age END AS age
      ,ID 
FROM table1 t2

或者你也可以使用自连接(我认为这样更好):

SELECT t1.sno
       , CASE WHEN t1.age = 0 
              THEN t2.age 
              ELSE t1.age END AS age
      ,t1.ID 
FROM table1 t1
JOIN table1 t2
  ON t1.sno = t2.sno
 AND t2.id=111;

输出:

╔═════╦═════╦═════╗
║ SNO ║ AGE ║ ID  ║
╠═════╬═════╬═════╣
║  66 ║ 250 ║ 111 ║
║  66 ║ 250 ║ 100 ║
║  66 ║ 250 ║  99 ║
║  66 ║ 250 ║  88 ║
║  66 ║ 250 ║  87 ║
║  67 ║ 270 ║ 225 ║
║  67 ║ 267 ║ 111 ║
║  67 ║ 267 ║  35 ║
║  68 ║ 230 ║ 111 ║
║  68 ║ 225 ║ 250 ║
║  68 ║ 230 ║ 230 ║
╚═════╩═════╩═════╝

See this SQLFiddle

【讨论】:

    【解决方案2】:

    当年龄为 0 时,我会将其视为在表中“查找”年龄。为此,我将查询构造为:

    select sno, (case when t.age = 0 then lookup.age else t.age end) as age, id
    from table1 t left outer join
         (select *
          from t
          where id = 111
         ) lookup
         on t.sno = lookup.sno;
    

    left outer join 是为了确保在没有“111”行的情况下不会丢失任何行。子查询要清楚查询中的逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 2016-03-15
      相关资源
      最近更新 更多