如果数据集不是那么大并且几何值遵循与上面显示的相同模式,您可以查看此解决方案
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;
此解决方案从给定模式中获取某些符号并尝试不同的组合以形成所有可能组合的列表。
问题是关于 ids 的。据说它应该从一个表中获取 id,但如果您希望它是唯一的,最好创建一个单独的表,您可以在其中放置带有自己唯一 id 的结果组合。