【发布时间】:2021-07-06 08:43:10
【问题描述】:
问题
我想以“并且这两列表示在此可能值列表中或这些值之一的邻居”的意义上进行连接。
背景
我有一个表,称为 GTT,在 postgresql 中,它在概念上是 (g, t) 对之间的映射:
((g1, t1), (g2, t2))
将其视为表示有向图(它确实如此,但它主要不是这样使用的)。
其他表有g 和t 列,一个常见的查询是做这样的事情:
SELECT g, t, a, b, c
FROM T
WHERE ...;
这些查询是由代码生成的,所以有时我们会遇到
SELECT g, t, a, b, c
FROM T
WHERE ...
AND ((g = G1 AND t = T1) OR (g = G2 AND t = T2));
(Gi, Ti) 对的列表(查询中的常量)可以变长,但不会太长,但宇宙中没有任何东西可以保证它们不会随时间增长。
回到问题
我想补充一点,(g, t) 值是(Gi, Ti) 之一或其中之一的邻居。
如果我只有G 和T,我可以这样做:
SELECT g, t, a, b, c
FROM T
INNER JOIN
(SELECT g1 g, t1 t
FROM GTT
WHERE g2 = G AND t2 = T
UNION
SELECT g2 g, t2 t
FROM GTT
WHERE g1 = G and t1 = T) TT
ON T.g = TT.g AND T.t = TT.t
WHERE ...;
如果不对每对重复两次 GTT 查询,我不知道如何处理多个 (Gi, Ti) 对。
有什么好办法吗?
示例
假设 GTT 在其他行中包含以下数据:
1 2 3 4
5 6 3 4
那么如果G = 3 和T = 4,原始查询将捕获表单的T 中的行
3 4 a1 b1 c1
3 4 a2 b2 c2
3 4 a3 b3 c3
但是通过连接来获取邻居,我们还会捕获类似的行
1 2 a4 b4 c4
5 6 a5 b5 c5
(对我而言)棘手的部分是,如果不是 (G, T) = (3, 4),而是 (G, T) in ((3, 4), (7, 8), (10, 12)),会怎样?
【问题讨论】:
-
请在您的问题中添加一些(假)数据和所需的结果。也可以定义neighbour。
-
当我说 GTT 是有向图时,我想我定义了邻居。 ;-)
-
没有列名很难/不可能理解。
标签: sql postgresql postgresql-9.5