60

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

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

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

?

4

4 回答 4

54

这个有可能:

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

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

您的 SQL 看起来不错。

于 2013-07-04T09:29:57.570 回答
49

没关系。事实上,您可以在 ON 子句中放置任何条件,甚至是与键列或表完全无关的条件,例如:

SELECT * from X
LEFT JOIN Y
    ON y.date = x.date
    AND y.code = x.code
    AND EXTRACT (dow from current_date) = 1
于 2013-07-04T10:21:10.170 回答
0

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

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

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

于 2021-09-12T23:14:35.067 回答
0

该解决方案具有良好的性能:

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
于 2021-02-15T15:22:58.003 回答