我找不到直截了当的答案。我的查询吐出错误的结果,我认为这是因为它没有将“AND”视为实际连接。
你能做这样的事情吗?如果没有,正确的方法是什么:
SELECT * from X
LEFT JOIN Y
ON
y.date = x.date AND y.code = x.code
?
我找不到直截了当的答案。我的查询吐出错误的结果,我认为这是因为它没有将“AND”视为实际连接。
你能做这样的事情吗?如果没有,正确的方法是什么:
SELECT * from X
LEFT JOIN Y
ON
y.date = x.date AND y.code = x.code
?
这个有可能:
ON 子句是最通用的连接条件:它采用与 WHERE 子句中使用的相同类型的布尔值表达式。如果对 T1 和 T2 的一对行的 ON 表达式计算结果为真,则它们匹配。
http://www.postgresql.org/docs/9.1/static/queries-table-expressions.html#QUERIES-FROM
您的 SQL 看起来不错。
没关系。事实上,您可以在 ON 子句中放置任何条件,甚至是与键列或表完全无关的条件,例如:
SELECT * from X
LEFT JOIN Y
ON y.date = x.date
AND y.code = x.code
AND EXTRACT (dow from current_date) = 1
另一种可以说是更易读的连接方式是使用列的元组:
SELECT * from X
LEFT JOIN Y
ON
(y.date, y.code) = (x.date, x.code)
;
,这清楚地表明连接是基于几列上的相等性。
该解决方案具有良好的性能:
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