我有4个表中的数据,并希望在一行中包含以下数据: 表1 *,表2。*,表3。*,表4。*
我使用内部联接来执行此操作但table4有2行具有相同的外键,因此我得到两行而不是一行。我想使用Listagg解决这个问题并将两个记录合并为一个,但我不确定如何做到这一点。我只看到了您选择特定列的示例,而不是*。
答案 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;
对于即席查询非常有用,但不应该在实际代码中使用。