使用Listagg在连接4个表中的数据时只获取一行

时间:2015-11-06 11:01:26

标签: sql oracle oracle11g listagg

我有4个表中的数据,并希望在一行中包含以下数据:               表1 *,表2。*,表3。*,表4。*

我使用内部联接来执行此操作但table4有2行具有相同的外键,因此我得到两行而不是一行。我想使用Listagg解决这个问题并将两个记录合并为一个,但我不确定如何做到这一点。我只看到了您选择特定列的示例,而不是*。

1 个答案:

答案 0 :(得分:0)

您还没有看到使用ExeConfigurationFileMap configMap = new ExeConfigurationFileMap(); configMap.ExeConfigFilename = @"G:\App.config"; Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); var ServiceEndpointName = config.AppSettings.Settings["ServiceEndpointName"].Value; configMap.ExeConfigFilename = @"G:\Client.config"; config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); var servicesFactory = new ConfigurationChannelFactory<TestWCF.IService1>(ServiceEndpointName, config, null); var client = servicesFactory.CreateChannel(); 的示例,因为您无法做到这一点,至少对于包含您想要聚合的列的表而言。您不希望按照您默认的目的聚合列进行分组。无法从*列表中排除列,因此如果您这样做,请说:

*

然后你会得到&#34; ORA-00979:不是GROUP BY表达式&#34;因为select t4.*, listagg(col2) within group (order by col2) from t4 group by t4.col1; 不在分组中;如果你把它包括在内,那么你为col2的每个唯一值得到一行,而不是一个值列表。

您必须展开列列表:

col2

可以仍然使用select t4.col1, listagg(t4.col2) within group (order by t4.col2) from t4 group by t4.col1; 等加入你的加入版本,但是因为你必须在group-by子句中明确地列出所有表中的所有列({{ 1}}不允许在那里,只在选择列表中)它并没有真正获得你的收获:

t1.*

您不妨这样做:

*

通常更好的做法是在选择列表中明确列出所有列,以避免出现意外 - 如果列在不同环境中的表中的列顺序不同,则不会发现问题(在适当的源代码控制下无论如何都不应该发生)如果将列添加到表中,查询结果将不会改变。 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; 对于即席查询非常有用,但不应该在实际代码中使用。