选择并加入问题

时间:2012-07-16 20:13:57

标签: sql sql-server-2005 join select-into

我的问题源于此:

VBA (Excel) vs SQL - Comparing values in two rows (loop)

我已经修改了脚本,它看起来像这样:

;WITH data AS 
( 
   SELECT a.i, a.M, b.M as NextM, 
   CASE WHEN a.M = 65 AND b.M = 120 THEN 1 ELSE 0 END AS shouldIncreaseQ   
   FROM MyTable a       
   LEFT OUTER JOIN MyTable b      
   ON a.i + 1 = b.i 
), test as
(
   SELECT data.M, data.NextM, 
   (SELECT COUNT(*) + 1 FROM data AS ref 
   WHERE ref.shouldIncreaseQ = 1 AND ref.i <= data.i) as Q FROM data 
)

所以现在让我们从测试中选择*。我得到的东西看起来像这样。

M      NextM     Q
65     65        1
65     65        1
65     120       2
120    63        2
65     120       3
120    NULL      3

现在......我想要的就是拿Q列(其中Q属于NextM)并将其放在我的原始mytable中。

这样的事情:

i     M      Q
1     65     1
2     65     1
3     120    2
4     63     2
5     120    3
6     55     3

我希望这是有道理的。我一直在玩选择,甚至插入所有DAY(字面上几小时)没有运气。 (使用你可以想象的每种类型的连接)

提前谢谢你。 (也有人可以告诉我如何使我的表看起来更好..你用html做什么或什么)?

更新:

;WITH data AS 
 ( 
   SELECT a.i, a.M, b.M as NextM, 
   CASE WHEN a.M = 65 AND b.M = 120 THEN 1 ELSE 0 END AS shouldIncreaseQ   
   FROM MyTable a       
   LEFT OUTER JOIN MyTable b      
   ON a.i + 1 = b.i 
 ), 
test as
(
   SELECT data.i, data.M, data.NextM, 
   (SELECT COUNT(*) + 1 FROM data AS ref 
   WHERE ref.shouldIncreaseQ = 1 AND ref.i <= data.i) as Q FROM data 
),
final as
(
   select a.i, a.M as zw_step,  b.Q as prodid
   from test a
   left outer join test b
   on a.i - 1 = b.i
)

SELECT final.i, final.zw_step, final.prodid
FROM final

现在.. select语句是我喜欢它的方式。除了darn之外的东西不能用于插入命令..(你可能不得不愚弄最终)。 我现在害怕CTE,我可能永远不会再使用它了。

感谢大家的帮助。

1 个答案:

答案 0 :(得分:1)

好的,我不太确定我是否正确理解你在寻找什么。但您可能想要替换

SELECT final.i, final.zw_step, final.prodid
FROM final;

UPDATE MT
  SET MT.Q = F.prodid
  FROM MyTable AS MT
  INNER JOIN final AS F ON MT.i = F.i AND MT.M = F.zw_step;

这会将QMyTable列中的值替换为prodidfinal列中的值。这是你想要做的吗? (根据“NOW ..我想要的是Q列(Q属于NextM)并将其放在我的原始mytable中。”)