blackyypvl Posted June 6, 2013 at 10:55 AM Report #511312 Posted June 6, 2013 at 10:55 AM Bom dia, Tenho uma base de dados que contém dados espaciais, e necessito de ter um ciclo onde lá dentro tenho uma query que me dá os pontos vizinhos de um determinado ponto selecionado (um buffer). A questão é que tenho que correr este ciclo para todos os registos que tenho na BD. Os ID's de cada um dos pontos começam em 420000. Desenvolvi esta query, a partir do BEGIN ela funciona mas agora ao tentar implementar o ciclo ele diz que a subquery está a returnar mais que um valor. Como poderei resolver este problema de maneira a conseguir correr a query em todos os registos da BD? WHILE ( SELECT ID_Registo FROM BD_TABD.dbo.Barco) > 420000 AND (SELECT ID_Registo FROM BD_TABD.dbo.Barco) < 425000 BEGIN DECLARE @Barco geometry; SELECT @Barco = PointID FROM BD_TABD.dbo.Barco DECLARE @ZonaColisao geometry; SET @ZonaColisao = @Barco.STBuffer(0.1); WITH Temporary AS ( SELECT ID_Registo, ID_Barco, PointID, Latitude, Longitude FROM BD_TABD.dbo.Barco WHERE PointID.Filter(@ZonaColisao)=1) SELECT * FROM Temporary END
xBoShY Posted June 10, 2013 at 09:38 PM Report #511918 Posted June 10, 2013 at 09:38 PM (edited) SELECT ID_Registo, ID_Barco, PointID, Latitude, Longitude FROM Barco as BarcoA WHERE EXISTS (SELECT * FROM Barco as BarcoB WHERE BarcoB.ID_Registo >= 420000 AND BarcoB.ID_Registo <= 425000 AND BarcoA.PointID.FILTER(BarcoB.PointID.STBuffer(0.1)) = 1) Edited June 10, 2013 at 09:39 PM by xBoShY 1 Report
blackyypvl Posted June 11, 2013 at 12:25 PM Author Report #512006 Posted June 11, 2013 at 12:25 PM Obrigado xBoShy. Problema resolvido.
xBoShY Posted June 11, 2013 at 11:07 PM Report #512176 Posted June 11, 2013 at 11:07 PM Caso seja necessário obter dados de ambos os lados da relação, é necessário utilizar o join: SELECT BarcoB.ID_Registo as ID_RegistoBuffer, BarcoA.ID_Registo, BarcoA.ID_Barco, BarcoA.PointID, BarcoA.Latitude, BarcoA.Longitude FROM Barco AS BarcoA INNER JOIN Barco AS BarcoB ON BarcoA.PointID.FILTER(BarcoB.PointID.STBuffer(0.1)) = 1 WHERE BarcoB.ID_Registo >= 420000 AND BarcoB.ID_Registo <= 425000
blackyypvl Posted June 11, 2013 at 11:10 PM Author Report #512177 Posted June 11, 2013 at 11:10 PM Uma vez mais obrigado xBoShy
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now