0

我有一个具有以下值的表

 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 clauseor some joinsor cursor

谢谢

4

2 回答 2

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

或者你也可以使用 self join 来做同样的事情(我认为这更好):

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 ║
╚═════╩═════╩═════╝

看到这个 SQLFiddle

于 2013-05-15T11:12:30.610 回答
0

当年龄为 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”行的情况下不会丢失任何行。子查询要清楚查询中的逻辑。

于 2013-05-15T11:32:07.970 回答