有没有什么办法可以在SELECT子句中使用子查询选择哈希,以便在
SqlUtil::AbstractTable方法上使用(比如getRowIterator()).
我在select_option_superquery中发现了类似的东西但是在那里使用的子查询在FROM子句中找到:
SELECT serviceid, service_methodid FROM (SELECT serviceid,service_methodid..)...
我正在寻找类似的东西:
SELECT t1.id, t1.order_id,
(SELECT COUNT(order_id) FROM tbl1 t2 WHERE t1.order_id = t2.order_id) as count,
t1.other_cols,
t3.other_cols
FROM tbl1 t1 left join tbl3 s on t1.id = t3.id
期望的结果是在结果集中计数order_id
tbl1
id order_id other_cols
1 ord1 ...
2 ord2 ...
3 ord1 ...
结果:
id order_id count other_cols
1 ord1 2 ...
2 ord2 1 ...
3 ord1 2 ...
最佳答案 你不能完全像你想要的那样(使用子查询作为选择列),但你可以使用你提到的
superquery选项和使用带有SqlUtil的SQL窗口函数和
cop_over() function执行此操作
代码可能如下所示:
list cols = (
"id",
"order_id",
cop_as(cop_over(cop_count("order_id"), "order_id"), "count"),
# ... other columns to select here - this is in the inner query
);
hash sh = (
"columns": cols,
"join": join_inner(t2, "t2", ("order_id": "order_id")) +
join_inner(t3, "t3", ("id": "id")),
"superquery": (
"columns": (
cop_distinct("id"), "order_id", "count"
# note put columns needed here without table prefixes, this is for the outer query
),
),
);
子查询与SqlUtil有点违反直觉,子查询使用顶级哈希参数指定,然后主查询(从子查询中选择)使用superquery哈希键指定,如上例所示.请注意,这将生成一个查询,其中t2中必须至少有一行.
如果t2中的行是可选的,请使用join_left()而不是join_inner().
以下代码将执行上面的查询哈希并记录生成的SQL和结果:
string sql;
list l = t1.selectRows(sh, \sql);
log(LL_INFO, "sql: %s", sql);
log(LL_INFO, "SQL results: %N", l);
我希望这有帮助!