1

我想使用多个 OR 值执行完全外连接,但我读过 PostgreSQL 只能在 = 符号每一侧的连接条件不同的情况下进行完全外连接。

在我的场景中,我有 2 个表:ticket 和 production。Ticket 上的一个寄存器可以有几个 Production.code 的值。例子:

TICKET|custom_field_1|custom_field_2|custom_field_3
    1| 10            |9             | 
    2|               |8             | 

PRODUCTION|CODE
         1| 10
         5| 8  
        12| 9               

在以下示例中,工单 ID 1 与生产代码 9 和 10 相关。工单 ID 2 与生产代码 8 相关。

我正在尝试编写一个查询以从表 Production 中返回列状态:

SELECT 
  production.status  
FROM ticket 
FULL OUTER JOIN production ON ticket.custom_field_1 = production.code
            OR ticket.custom_field_2 = production.code
            OR ticket.custom_field_3 = production.code
GROUP BY 1
ORDER BY 1 
LIMIT 1000

当我尝试运行此查询时,出现错误:Invalid operation: FULL JOIN is only supported with merge-joinable join conditions;

因此,我开始将其替换为 CROSS JOIN。查询几乎可以工作,但我面临的行数不同:

SELECT count(production.id) FROM ticket
CROSS JOIN production
WHERE date(production.ts_real) >= '2019-03-01' AND
      ((ticket.custom_field_1 = sisweb_producao.proposta) OR
       (ticket.custom_field_2 = sisweb_producao.proposta) OR
       (ticket.custom_field_3 = sisweb_producao.proposta));

上面的这个查询应该返回 202 行,但由于我的条件只给出 181 行。我怎样才能让交叉连接像一个完整的外部一样工作?

我正在使用一个名为 Looker 的工具,这就是我以这种方式构建此查询的原因。

4

1 回答 1

3

目前还不清楚您的表的架构是什么,因为您的某些示例 SQL 包含示例架构中没有的列,但看起来您可以使用另一种方法来旋转票证列并使用内部将它们连接到生产表加入以实现相同的目标:

SELECT 
    t1.ticket
    , production.id
    , production.status
FROM 
(
    SELECT 
        ticket
        , custom_field_1 AS code
    FROM 
        ticket
    WHERE 
        custom_field_1 IS NOT NULL

    UNION

    SELECT 
        ticket
        , custom_field_2 AS code
    FROM 
        ticket
    WHERE 
        custom_field_2 IS NOT NULL

    UNION

    SELECT 
        ticket
        , custom_field_3 AS code
    FROM 
        ticket
    WHERE 
        custom_field_3 IS NOT NULL
) t1
INNER JOIN 
    production ON t1.code = production.code

根据您提供的示例数据,看起来一张票可能与多个生产代码相关,因此可能与多个“状态”相关,因此无论您采用哪种方式,请注意每张票可能会有多个结果行。

于 2019-03-25T19:23:50.730 回答