批量迭代临时表

时间:2016-11-17 15:27:28

标签: sql sql-server

我有一组带有一组数据的临时表

-----------------------------------------------------
| col1  | col2      | col3      | col4      | status| 
-----------------------------------------------------
| a     | a12       | dd        | ff        | 1     | 
-----------------------------------------------------
| b     | b43       | dd        | ff        | 2     | 
-----------------------------------------------------
| c     | fe3       | dd        | ff        | 3     |
-----------------------------------------------------
| d     | fd2       | gg        | hh        | 1     |   
-----------------------------------------------------               
| e     | sf2       | gg        | hh        | 1     |   
-----------------------------------------------------   
| f     | vd2       | ii        | jj        | 3     |
-----------------------------------------------------
| g     | cd3       | ii        | jj        | 3     |
-----------------------------------------------------

我需要批量处理表以选择一些行。

  

首先考虑col3 = dd和col4 = ff的行,并只选择一行   row(我有一个算法来选择这一行)然后考虑行   使用col3 = gg和col4 = hh并选择onse然后考虑行   col3 = ii和col4 = jj并选择一行。

如何遍历临时表以选择行和进程的子集。??

我需要根据状态列从每个子集(具有相同col3和col4的子集)中获取一行。

预期结果: -

| col1  | col2      | col3      | col4      | status| 
-----------------------------------------------------
| b     | b43       | dd        | ff        | 2     | 
-----------------------------------------------------    
| d     | fd2       | gg        | hh        | 1     |   
-----------------------------------------------------               
| f     | vd2       | ii        | jj        | 3     |
-----------------------------------------------------

2 个答案:

答案 0 :(得分:0)

这取决于目的和数据库引擎。

  1. 如果你想在这个表中迭代和修改数据,你可以使用cursor,while loop,cte,recursive update ...
  2. 如果需要迭代对象(表,数据库),则应使用基于sytem foreach的过程(例如sp_MSforeachdb)。
  3. 如果你想获得一些价值并且只选择下一张表中的内容,你应该使用函数。
  4. 如果您想要迭代解决方案,可以使用cursor或while循环。但是,请尝试重新考虑您的计划并尝试使用基于集合的解决方案(当然,如果可能的话)。

答案 1 :(得分:0)

您可以使用窗口函数实现此目的,在您想要一个不同行的任何列集上进行分区:

declare @t table (ID int, TextValue nvarchar(10));
insert into @t values(1,'a'),(2,'a'),(3,'a'),(4,'b'),(5,'b'),(6,'b'),(7,'c'),(8,'c'),(9,'c');

select ID
      ,TextValue
from(select ID
            ,TextValue
            ,row_number() over (partition by TextValue order by ID) as rn
    from @t
) a
where rn = 1;