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 |
然后你需要一个 < 或 > 而不是 <> 。
这类似于您尝试在数据中查找欺骗者
Run Code Online (Sandbox Code Playgroud)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| | n :---- | :---- 聚1 | 聚2
db<>在这里摆弄