Estou usando um procedimento armazenado do SQL Server para gerar um relatório do Excel. Basicamente cada "entrada" no relatório tem três partes: Objeto, Observação e Pontos. As observações têm uma referência à chave primária de um objeto e os pontos têm uma referência a uma observação. Essa é a relação entre as partes. (Desculpe se minha terminologia estiver errada, estou acostumado a escrever em C# ou Java, mas ainda aprendendo SQL.)
Eu quero que a saída seja assim:
-Object
-All Observations linked to that Object
- Under each observation there should be all the points linked to that observation
E repita para cada objeto. Eu tenho esse trabalho usando um cursor para gerar todas as observações com cada objeto, mas não consigo fazer com que os pontos apareçam em cada observação.
Eu li em toda a Internet que os cursores são ruins e presumo que isso significa que os cursores aninhados são muito ruins. Mas isso é o que eu tenho até agora. Se você souber de uma maneira melhor de fazer isso, por favor me diga. Estou aberto para refatorar totalmente isso, se necessário.
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
Sinto que a ordem em que estou executando esses loops está errada de alguma forma, mas não consegui obtê-la. A saída atual é:
-Object
-Observations for that object
-empty points result set
Esses resultados são repetidos várias vezes para o mesmo objeto antes de ir para o próximo, e os pontos estão sempre vazios.
Qualquer ajuda ou indicação em outra direção é muito apreciada.
Você está pesquisando nos lugares errados, se assim posso dizer. Você mesmo diz que é novo no SQL e, no entanto, descobriu como implementar um cursor em vez de escrever um arquivo
JOIN
. Você escreveu 33 linhas onde 5 servirão e garantiu que sua consulta será executada 1% mais rápido do que normalmente.Eu ouço conceder a você uma estrela de ouro por perguntar! Agora comece a trabalhar com um bom livro de SQL, como An Introduction to Database Systems (8ª edição), 2003, CJ Date.