【问题标题】:Join postgres table on two columns?在两列上加入postgres表?
【发布时间】:2021-09-13 07:14:35
【问题描述】:

我找不到一个直截了当的答案。我的查询吐出错误的结果,我认为这是因为它没有将“AND”视为实际连接。

你能做这样的事情吗?如果不能,正确的方法是什么:

SELECT * from X
LEFT JOIN Y
ON
  y.date = x.date AND y.code = x.code

?

【问题讨论】:

  • 预期的实际结果是什么?
  • 语法正确 - 否则您会收到错误消息。您的描述“吐出错误的结果”并没有告诉我们有关您的问题的任何信息。您必须向我们展示一些示例数据和预期的输出。最好在sqlfiddle.com 上创建一个小例子

标签: postgresql


【解决方案1】:

这是可能的:

ON 子句是最通用的连接条件:它采用与 WHERE 子句中使用的相同类型的布尔值表达式。如果 T1 和 T2 中的一对行的 ON 表达式计算结果为真,则它们匹配。

http://www.postgresql.org/docs/9.1/static/queries-table-expressions.html#QUERIES-FROM

您的 SQL 看起来不错。

【讨论】:

    【解决方案2】:

    没关系。事实上,你可以把 any 条件放在 ON 子句中,甚至一个 与键列甚至表完全无关,例如:

    SELECT * from X
    LEFT JOIN Y
        ON y.date = x.date
        AND y.code = x.code
        AND EXTRACT (dow from current_date) = 1
    

    【讨论】:

      【解决方案3】:

      另一种可以说更易读的连接方式是使用列的元组:

      SELECT * from X
      LEFT JOIN Y
      ON
        (y.date, y.code) = (x.date, x.code)
      ;
      

      ,这清楚地表明连接是基于几列上的相等性。

      【讨论】:

        【解决方案4】:

        这个方案性能不错:

        select * from(
           select md5(concat(date, code)) md5_x from x ) as x1
        left join (select md5(concat(date, code)) md5_y from y) as y1
        on x1.md5_x = y1.md5_y
        

        【讨论】:

          猜你喜欢
          • 2013-07-07
          • 2015-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-18
          • 2012-05-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多