【问题标题】:Combine predicates on two joined tables with OR用 OR 组合两个连接表上的谓词
【发布时间】:2020-07-31 17:43:24
【问题描述】:

我有三张桌子:

t_tbl
-----
t_id PK
t

p_tbl
-----
p_id PK
p

x_tbl
-----
x_id PK
x
t_id
p_id

我的搜索单独工作:

查询 1:

SELECT x
FROM x_tbl xt
INNER JOIN
t_tbl tt
ON
xt.t_id = tt.t_id

查询 2:

SELECT x
FROM x_tbl xt
INNER JOIN
p_tbl pt
ON xt.p_id = pt.p_id

但我想得到xt.x if xt.t_id = tt.t_id OR xt.p_id = pt.p_id

【问题讨论】:

    标签: sql postgresql join


    【解决方案1】:

    我会尝试两个左连接,然后评估是否找到一个或另一个:

    select
      x.x
    from
      x_tbl x
      left join p_tbl p on
        p.p_id = x.p_id
      left join t_tbl t on
        t.t_id = x.t_id
    where
      p.i_id is not null or t.t_id is not null
    

    【讨论】:

      【解决方案2】:

      也许UNION结果在一起?

      SELECT x FROM x_tbl xt INNER JOIN t_tbl tt ON xt.t_id = tt.t_id
      UNION
      SELECT x FROM x_tbl xt INNER JOIN p_tbl pt ON xt.p_id = pt.p_id
      

      【讨论】:

      • 如果您的每个原始查询都没有返回任何结果,这是非常不寻常的......
      • 对不起。我已经在我的代码中注释掉了函数调用,所以没有返回任何内容。不过还是有问题。 x 是我表中的 xml 类型。我收到此错误:psycopg2.errors.UndefinedFunction: could not identify an equal operator for type xml。尽管没有联合,但它可以单独工作。
      • 你能发布这些表的 DDL 吗?
      【解决方案3】:

      任何JOIN 都可以相乘 行,它会在另一侧找到多个匹配项。 (从描述中不清楚这是否会发生在您的数据库设计中。)看起来您并不想要那样。而且由于另一侧有很多行和/或多个连接,它很快就会变得非常昂贵。

      您似乎想要来自x_tbl1 行,其中满足条件。
      EXISTS 是从不将@ 中的行相乘的安全方式987654326@。 它也应该是最快的。

      SELECT x.x
      FROM   x_tbl x
      WHERE  EXISTS (SELECT FROM t_tbl t WHERE t.t_id = x.t_id)
      OR     EXISTS (SELECT FROM p_tbl p WHERE p.p_id = x.p_id)
      

      这可能发生在 2x LEFT JOIN:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-11
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        相关资源
        最近更新 更多