嵌套游标,多个结果集

时间:2014-07-24 20:32:37

标签: sql sql-server cursor

我正在使用SQL Server存储过程来生成Excel报告。基本上,报告中的每个“条目”都有三个部分:对象,观察和点。观察结果引用了对象的主键,并且这些点具有对观察的引用。这是各部分之间的关​​系。 (对不起,如果我的术语已关闭,我习惯用C#或Java编写,但仍在学习SQL。)

我希望输出如下:

-Object

  -All Observations linked to that Object

    - Under each observation there should be all the points linked to that observation

并重复每个对象。我有这个工作使用光标生成每个对象的所有观察,但我不能得到每个观察下的点。

我已经在互联网上看到游标是坏的,我认为这意味着嵌套游标非常糟糕。但这是我到目前为止所拥有的。如果您知道更好的方法,请告诉我。如果有必要,我愿意完全重构这一点。

  DECLARE @Object_Cursor cursor
  DECLARE @Observation_Cursor cursor
  DECLARE @i int
  DECLARE @j int
  DECLARE @row int = 1
  SET @Object_Cursor = CURSOR FOR (SELECT PK_ObjectId FROM Objects)
  OPEN @Object_Cursor
  FETCH NEXT FROM @Object_Cursor INTO @i
    While @@FETCH_STATUS = 0
    Begin
    Select 
        PK_ObjectID,
        Name,
        Timestamp
    From Objects where PK_ObjectID = @i


  SET @Observation_Cursor = CURSOR FOR (SELECT @PK_ObservationID FROM Observations)
  OPEN @Observation_Cursor
  FETCH NEXT FROM @Observation_Cursor INTO @j
    While @@FETCH_STATUS = 0
    Begin
    Select
        Timestamp,
        Note,
        User
        from Observations
        where FK_ObjectId = @i
        order by FK_ObjectID

    Select Lat, Lng 
    From Pts
    Where FK_ObservationID = @j
    Fetch Next From @Observation_Cursor into @j
    END

    FETCH NEXT FROM @Object_Cursor into @i
    END

    Close @Observation_Cursor
    DEALLOCATE @Observation_Cursor
    CLOSE @Object_Cursor
    DEALLOCATE @Object_Cursor

我觉得我执行这些循环的顺序是以某种方式关闭,但我无法得到它。目前的输出是:

 -Object    
   -Observations for that object
    -empty points result set

对于同一个对象,在进入下一个对象之前,这些结果会重复多次,并且这些结果总是为空。

非常感谢任何其他方向的帮助或指示。

1 个答案:

答案 0 :(得分:2)

C#循环逻辑不是你想要的SQL ... 1语句总是更好。

我认为这很接近你想要的......我猜你的关键点。

Select 
    (pick your fields here)
From Objects
left join Observations on objects.PK_ObjectID  = Observations.FK_ObjectID
left join Pts on Pts.FK_ObservationID  = observations.pk_observation_ID