【问题标题】:Using comparison operators in ON clause在 ON 子句中使用比较运算符
【发布时间】:2019-11-06 04:02:24
【问题描述】:

不能在 ON 子句中使用比较运算符?

[如何重现]

  • ClickHouse 服务器版本:v19.11.0
  • 两个表的示例

表1

CREATE TABLE table1
(
    str1 String,
    num1 UInt64
) ENGINE=MergeTree()
ORDER BY (str1);

表2

CREATE TABLE table2
(
    str2 String,
    num2 UInt64
) ENGINE=MergeTree()
ORDER BY (str2);

查询

SELECT
    *
FROM
    table1 AS t1
LEFT OUTER JOIN
    table2 AS t2
ON
    t1.str1 = t2.str2
    AND greater(t1.num1, t2.num2) = 1;

错误信息

DB::Exception: Invalid columns in JOIN ON section. Columns num1 and num2 are from different tables..

没有AND greater(t1.num1, t2.num2) = 1,查询成功。

【问题讨论】:

  • 我认为问题在于greater() 函数不支持该功能。您可能会在 clickhouse 存储库中打开错误报告/FR
  • 我将问题添加为功能请求。github.com/yandex/ClickHouse/issues/5736
  • 以防万一,显然,您可以将条件移至WHERE 子句,如SELECT * FROM table1 AS t1 LEFT JOIN table2 AS t2 ON t1.str1 = t2.str2 WHERE t1.num1 > t2.num2,只需注意null 处理即可。
  • 只需删除更大(...)后面的= 1。那应该行得通。但这与使用> 符号基本相同。 a > b 在内部被 clickhouse 解析为 greater(a, b)

标签: clickhouse


【解决方案1】:

我认为你需要 ASOF JOIN。

ASOF JOIN 在您需要连接没有确切信息的记录时很有用 匹配。

例如,SELECT count() FROM table_1 ASOF LEFT JOIN table_2 ON table_1.a == table_2.b AND table_2.t

https://clickhouse.com/docs/en/sql-reference/statements/select/join/#asof-join-usage

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2014-09-08
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多