消除相交的额外行

Han*_*non 4 sql-server duplication

我有一个几何值表,其中一些行与其他行相交。

我需要一个几何与其他行重叠的行列表,但我希望该列表尽可能简洁。

这是设置:

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;
Run Code Online (Sandbox Code Playgroud)

输出看起来像:

n n
聚2 聚1
聚1 聚2

但是,为简洁起见,我只想要一行。即,因为 poly1 与 poly2 重叠并且poly2 与 poly1 重叠,所以我得到两行返回,我只想要一行,如下所示:

n n
聚1 聚2

nbk*_*nbk 6

然后你需要一个 < 或 > 而不是 <> 。

这类似于您尝试在数据中查找欺骗者

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;
GO
Run Code Online (Sandbox Code Playgroud)
| | n    
:---- | :----
聚1 | 聚2

db<>在这里摆弄