您还没有看到使用* 的示例,因为您不能这样做,至少对于包含您要聚合的列的表来说是这样。您不想按要聚合的列进行分组,因为默认值是目的。无法从 * 列表中排除列,因此如果您这样做了,请说:
select t4.*, listagg(col2) within group (order by col2)
from t4
group by t4.col1;
然后你会得到“ORA-00979: not a GROUP BY expression”,因为col2 不在 group-by 中;如果您包含它,那么无论如何您都会为col2 的每个唯一值返回一行,而不是值列表。
你必须展开列列表:
select t4.col1, listagg(t4.col2) within group (order by t4.col2)
from t4
group by t4.col1;
您可以仍将t1.* 等用于您的连接版本,但因为无论如何您都必须在 group-by 子句中明确列出所有表中的所有列(* 是'不允许在那里,只在选择列表中)它并没有真正让你受益:
select t1.*, t2.*, t3.*, t4.col1,
listagg(t4.col2) within group (order by t4.col2)
from t1
join ...
group by t1.col1, t1.col2, t2.col1, ..., t4.col1;
你也可以这样做:
select t1.col1, t1.col2, t2.col1, ..., t4.col1,
listagg(t4.col2) within group (order by t4.col2)
from t1
join ...
group by t1.col1, t1.col2, t2.col1, ..., t4.col1;
通常更好的做法是在选择列表中明确列出所有列,以避免意外 - 如果列在不同环境中的表中的顺序不同,您将不会看到问题(这不应该真的在适当的源代码控制下无论如何都会发生)并且如果将列添加到表中,查询结果将不会改变。 select * 对于即席查询很有用,但实际上不应该在实际代码中使用。