Eu tenho uma tabela de valores de geometria onde algumas linhas se cruzam com outras linhas.
Preciso de uma lista de linhas em que a geometria se sobreponha a outras linhas, mas gostaria que a lista fosse o mais concisa possível.
Aqui está a configuração:
USE tempdb;
DROP TABLE IF EXISTS dbo.t;
CREATE TABLE dbo.t
(
n varchar(100) NOT NULL
, i geometry NOT NULL
);
INSERT INTO dbo.t (n, i)
VALUES ('poly1', geometry::STGeomFromText('POLYGON ((1 2, 1 4, 1 5, 4 6, 1 2))', 4326))
, ('poly2', geometry::STGeomFromText('POLYGON ((1 2, 1 3, 2 5, 4 6, 1 2))', 4326))
, ('poly3', geometry::STGeomFromText('POLYGON ((7 9, 8 7, 9 6, 7 9))', 4326))
SELECT t1.n
, t2.n
FROM dbo.t t1
INNER JOIN dbo.t t2 ON t1.i.STIntersects(t2.i) = 1
WHERE
t1.n <> t2.n;
A saída se parece com:
n | n |
---|---|
poli2 | poli1 |
poli1 | poli2 |
No entanto, eu gostaria de apenas uma única linha para brevidade. ou seja, porque poly1 se sobrepõe a poly2 e poly2 se sobrepõe a poly1, estou recebendo duas linhas retornadas onde gostaria de apenas uma, como em:
n | n |
---|---|
poli1 | poli2 |
Então você precisa de um < ou > em vez de um <>.
Isso é semelhante a quando você tenta encontrar dupes em seus dados
db<>fique aqui