2014-07-24 99 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