2014-07-24 120 views
1

我正在使用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 

这些结果被重复多次为同一对象时,它转到下一个之前和点总是空的。

任何帮助或指针在另一个方向非常感谢。

+0

c#思维在SQL中无法正常工作。重新思考,不要使用循环。任何原因,这是不是因为三个表加入一个sedlect语句? – Twelfth

+0

唉!嵌套游标。冬季阿拉斯加以外的糖蜜会慢慢变慢。 –

+0

@Telfelf那么,我需要的结果是单独的原因,每个对象有多个观察值,每个观测值有多个点。我不知道如何将它合并到一个select语句中并维护我需要的结构。 –

回答

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 
+0

好的,我会试试这个!谢谢您的帮助。 –

+0

这好多了。出于某种原因,我认为试图选择这种方式会打破,如果我有多个观察/点为每个对象哈哈。猜猜我只需要更多的练习来围绕如何在SQL中正确地做事情。 –

+1

这是一个非常不同的思维模式......大多数编程语言最终都是线性的,您需要这种循环思路。 SQL是基于设置的,这需要非常不同的思维框架。 – Twelfth