我正在使用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 :(得分: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