【问题标题】:select from a set of pairs in postgresql从 postgresql 中的一组对中选择
【发布时间】:2021-07-06 08:43:10
【问题描述】:

问题

我想以“并且这两列表示在此可能值列表中或这些值之一的邻居”的意义上进行连接。

背景

我有一个表,称为 GTT,在 postgresql 中,它在概念上是 (g, t) 对之间的映射:

((g1, t1), (g2, t2))

将其视为表示有向图(它确实如此,但它主要不是这样使用的)。

其他表有gt 列,一个常见的查询是做这样的事情:

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) 之一其中之一的邻居。

如果我只有GT,我可以这样做:

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 = 3T = 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


【解决方案1】:

这个查询解决了问题:

SELECT  mt.g, mt.t, mt.a, mt.b, mt.c
FROM main_table mt
INNER JOIN
  (
   SELECT g, t
   FROM (VALUES (1, 2)) as TB(g, t)
  UNION
   SELECT  g1 g, t1 t
   FROM GTT
   WHERE (g1, t1) in ((G1, T1), (G2, T2))
  UNION
   SELECT  g2 g, t2 t
   FROM GTT
   WHERE (g1, t1) in ((G1, T1), (G2, T2))
  ) TT
ON TT.g = mt.g AND TT.t = mt.t;

【讨论】:

    猜你喜欢
    • 2018-06-11
    • 2021-12-18
    • 1970-01-01
    • 2020-08-30
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多