如何对两个不相关的表执行查询
How to perform query on two unrelated tables
我有一个 table A
Id
和 Geometry
和Temporary table B
Temporary table B
的每个几何图形在 Table A
中都有相交的几何图形。我想找到相交的几何图形并将几何图形合并。最后的 table 应该是 Table A
的 id,它具有几何的交集和并集。如果有超过 1 个相交的几何图形,则选择任意一个。
我无法在此处执行连接,因为这些 table 之间没有公共列,所以不知道如何获得最终结果。
如果数据集不是很大并且几何值遵循与上面所示相同的模式,您可以查看此解决方案
WITH a AS (
SELECT 1 AS id
, 'LineAB' AS geometry
UNION ALL
SELECT 2
, 'LineDE'
UNION ALL
SELECT 3
, 'LineFG'
UNION ALL
SELECT 4
, 'LineXY' )
, temp_b AS (
SELECT 'LineBC' AS geometry
UNION ALL
SELECT 'LineCD'
UNION ALL
SELECT 'LineEF' )
, a_last AS (
SELECT a.id
, a.geometry
, RIGHT(a.geometry, 1) AS a_key -- get the last symbol for further join with temp_b
FROM a )
, a_nlast AS (
SELECT a.id
, a.geometry
, SUBSTRING(a.geometry, 5, 1) AS a_key
FROM a )
, b_nlast AS (
SELECT temp_b.geometry
, SUBSTRING(temp_b.geometry, 5, 1) AS b_key -- get one symbol before the last symbol for further join with a table
FROM temp_b )
, b_last AS (
SELECT temp_b.geometry
, RIGHT(temp_b.geometry, 1) AS b_key
FROM temp_b )
-- try all possible combinations of last and not last sybols from both tables
SELECT a_last.id
, CONCAT('Union (', SUBSTRING(a_last.geometry, 5, 2), '+', SUBSTRING(b_nlast.geometry, 5, 2), ')')
FROM a_last JOIN b_nlast ON a_last.a_key = b_nlast.b_key
UNION ALL
SELECT a_last.id
, CONCAT('Union (', SUBSTRING(a_last.geometry, 5, 2), '+', SUBSTRING(b_last.geometry, 5, 2), ')')
FROM a_last JOIN b_last ON a_last.a_key = b_last.b_key
UNION ALL
SELECT a_nlast.id
, CONCAT('Union (', SUBSTRING(a_nlast.geometry, 5, 2), '+', SUBSTRING(b_last.geometry, 5, 2), ')')
FROM a_nlast JOIN b_last ON a_nlast.a_key = b_last.b_key
UNION ALL
SELECT a_nlast.id
, CONCAT('Union (', SUBSTRING(a_nlast.geometry, 5, 2), '+', SUBSTRING(b_nlast.geometry, 5, 2), ')')
FROM a_nlast JOIN b_nlast ON a_nlast.a_key = b_nlast.b_key;
此解决方案从给定模式中获取某些符号,并尝试不同的组合以形成所有可能组合的列表。
问题是关于 ID 的。据说它应该从 table 中获取 id,但如果你希望它是唯一的,最好创建一个单独的 table,你可以将结果组合与它们自己的唯一 id 放在一起.
在演示中,我使用类型 intrange
来模拟类型 geometry
。范围足够接近以获得相同的查询:
SELECT DISTINCT ON (b.id) -- 3
a.id,
a.geom + b.geom -- 2
FROM a
JOIN b ON a.geom && b.geom -- 1
- 连接条件应该是交叉检查。对于范围,它是
&&
运算符,在您的情况下它应该是 st_intersects(a.geom, b.geom)
- 合并两个几何图形。这里是使用
+
运算符完成的,在你的情况下它应该是 st_union(a.geom, b.geom)
DISTINCT ON(b.id)
确保每个 b.id
只有一条记录
因此,您的最终查询应如下所示:
SELECT DISTINCT ON (b.id) -- 3
a.id,
st_union(a.geom, b.geom) -- 2
FROM a
JOIN b ON st_intersects(a.geom, b.geom) -- 1
我想以下 SQL 会起作用:
SELECT a.id, ST_UNION(a.geometry, b.geometry)
FROM table_A as a, temp_table_B as b
WHERE ST_INTERSECTS(a.geometry, b.geometry)
您可以对结果进行分组以处理多个交叉点。
我有一个 table A
Id
和 Geometry
和Temporary table B
Temporary table B
的每个几何图形在 Table A
中都有相交的几何图形。我想找到相交的几何图形并将几何图形合并。最后的 table 应该是 Table A
的 id,它具有几何的交集和并集。如果有超过 1 个相交的几何图形,则选择任意一个。
我无法在此处执行连接,因为这些 table 之间没有公共列,所以不知道如何获得最终结果。
如果数据集不是很大并且几何值遵循与上面所示相同的模式,您可以查看此解决方案
WITH a AS (
SELECT 1 AS id
, 'LineAB' AS geometry
UNION ALL
SELECT 2
, 'LineDE'
UNION ALL
SELECT 3
, 'LineFG'
UNION ALL
SELECT 4
, 'LineXY' )
, temp_b AS (
SELECT 'LineBC' AS geometry
UNION ALL
SELECT 'LineCD'
UNION ALL
SELECT 'LineEF' )
, a_last AS (
SELECT a.id
, a.geometry
, RIGHT(a.geometry, 1) AS a_key -- get the last symbol for further join with temp_b
FROM a )
, a_nlast AS (
SELECT a.id
, a.geometry
, SUBSTRING(a.geometry, 5, 1) AS a_key
FROM a )
, b_nlast AS (
SELECT temp_b.geometry
, SUBSTRING(temp_b.geometry, 5, 1) AS b_key -- get one symbol before the last symbol for further join with a table
FROM temp_b )
, b_last AS (
SELECT temp_b.geometry
, RIGHT(temp_b.geometry, 1) AS b_key
FROM temp_b )
-- try all possible combinations of last and not last sybols from both tables
SELECT a_last.id
, CONCAT('Union (', SUBSTRING(a_last.geometry, 5, 2), '+', SUBSTRING(b_nlast.geometry, 5, 2), ')')
FROM a_last JOIN b_nlast ON a_last.a_key = b_nlast.b_key
UNION ALL
SELECT a_last.id
, CONCAT('Union (', SUBSTRING(a_last.geometry, 5, 2), '+', SUBSTRING(b_last.geometry, 5, 2), ')')
FROM a_last JOIN b_last ON a_last.a_key = b_last.b_key
UNION ALL
SELECT a_nlast.id
, CONCAT('Union (', SUBSTRING(a_nlast.geometry, 5, 2), '+', SUBSTRING(b_last.geometry, 5, 2), ')')
FROM a_nlast JOIN b_last ON a_nlast.a_key = b_last.b_key
UNION ALL
SELECT a_nlast.id
, CONCAT('Union (', SUBSTRING(a_nlast.geometry, 5, 2), '+', SUBSTRING(b_nlast.geometry, 5, 2), ')')
FROM a_nlast JOIN b_nlast ON a_nlast.a_key = b_nlast.b_key;
此解决方案从给定模式中获取某些符号,并尝试不同的组合以形成所有可能组合的列表。
问题是关于 ID 的。据说它应该从 table 中获取 id,但如果你希望它是唯一的,最好创建一个单独的 table,你可以将结果组合与它们自己的唯一 id 放在一起.
在演示中,我使用类型 intrange
来模拟类型 geometry
。范围足够接近以获得相同的查询:
SELECT DISTINCT ON (b.id) -- 3
a.id,
a.geom + b.geom -- 2
FROM a
JOIN b ON a.geom && b.geom -- 1
- 连接条件应该是交叉检查。对于范围,它是
&&
运算符,在您的情况下它应该是st_intersects(a.geom, b.geom)
- 合并两个几何图形。这里是使用
+
运算符完成的,在你的情况下它应该是st_union(a.geom, b.geom)
DISTINCT ON(b.id)
确保每个b.id
只有一条记录
因此,您的最终查询应如下所示:
SELECT DISTINCT ON (b.id) -- 3
a.id,
st_union(a.geom, b.geom) -- 2
FROM a
JOIN b ON st_intersects(a.geom, b.geom) -- 1
我想以下 SQL 会起作用:
SELECT a.id, ST_UNION(a.geometry, b.geometry)
FROM table_A as a, temp_table_B as b
WHERE ST_INTERSECTS(a.geometry, b.geometry)
您可以对结果进行分组以处理多个交叉点。