Sql 如何返回由存储在多个记录中的值生成的单个值?
不幸的是,我是一名应用程序开发人员,为了返回应用程序的数据,我需要编写(/update)SQL语句。我在SQL方面的经验有限,因此如果有任何帮助,我将不胜感激 我们有一个Oracle数据库11g(11.2.0.4.0) 示例表 我创建了下面的示例,它复制了我们的设置。它包括:Sql 如何返回由存储在多个记录中的值生成的单个值?,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,不幸的是,我是一名应用程序开发人员,为了返回应用程序的数据,我需要编写(/update)SQL语句。我在SQL方面的经验有限,因此如果有任何帮助,我将不胜感激 我们有一个Oracle数据库11g(11.2.0.4.0) 示例表 我创建了下面的示例,它复制了我们的设置。它包括: 包含不同城市旅行记录的主表。(主跳闸表) 包含通过内部联接链接到这些行程的附加属性的各种附加表。(附加表格) 一个单独的表格,显示在旅程中采取的步骤(即访问的临时地点)。STEP_NUM=1的值始终是最终目的地,因此主表
- 包含不同城市旅行记录的主表。(主跳闸表)
- 包含通过内部联接链接到这些行程的附加属性的各种附加表。(附加表格)
- 一个单独的表格,显示在旅程中采取的步骤(即访问的临时地点)。STEP_NUM=1的值始终是最终目的地,因此主表中每次行程的表中始终至少有一条记录。如果行程中有任何临时站点,则将它们作为单独的记录列在本表中,步骤_NUM向上迭代。(行程\步数\表)
SELECT
MAIN_TRIP_TABLE.RECORD_ID
, MAIN_TRIP_TABLE.PROP_1
, MAIN_TRIP_TABLE.PROP_2
, ADDITIONAL_TABLE.PROP_3
, <Concatenation/Array of JOURNEY_STEPS_TABLE> as "InterimStops"
FROM MAIN_TRIP_TABLE
INNER JOIN ADDITIONAL_TABLE ON MAIN_TRIP_TABLE.RECORD_ID = ADDITIONAL_TABLE.RECORD_ID
LEFT OUTER JOIN JOURNEY_STEPS_TABLE ON MAIN_TRIP_TABLE.RECORD_ID = JOURNEY_STEPS_TABLE.RECORD_ID
这返回的值正是我要查找的值,但当我试图从主表和附加表(例如:main_TRIP_table.PROP_1、main_TRIP_table.PROP_2、附加_table.PROP_3)中返回其他值时,这就失败了。这给了我一个“ORA-00979:非表达式分组”错误
然后,我试图通过子查询获取这些数据,但很难让任何东西正常工作
如果您能提供任何帮助、见解或直接指出正确的方向,我们将不胜感激。
非常感谢使用子查询更容易做到这一点,因此您不必在连接的列集合上对数据进行分组(正如您所尝试的): 另一种可能性是
左连接分组数据:
SELECT MAIN_TRIP_TABLE.RECORD_ID
, JOURNEY_STEPS_TABLE."InterimStops"
FROM MAIN_TRIP_TABLE
LEFT JOIN (SELECT RECORD_ID
, LISTAGG(LOCATION, ',') WITHIN GROUP (ORDER BY STEP_NUMBER) "InterimStops"
FROM JOURNEY_STEPS_TABLE
GROUP BY RECORD_ID) JOURNEY_STEPS_TABLE
ON JOURNEY_STEPS_TABLE.RECORD_ID = MAIN_TRIP_TABLE.RECORD_ID
RECORD_ID | STEP_NUM | LOCATION | ...
--------------------------------------
10001 | 1 | London | ...
10002 | 1 | Reading | ...
10002 | 2 | Bath | ...
10003 | 1 | Leeds | ...
10003 | 2 | York | ...
10003 | 3 | Bristol | ...
10004 | 1 | York | ...
10004 | 2 | Cardiff | ...
10004 | 3 | Oxford | ...
10004 | 4 | London | ...
SELECT
MAIN_TRIP_TABLE.RECORD_ID
, MAIN_TRIP_TABLE.PROP_1
, MAIN_TRIP_TABLE.PROP_2
, ADDITIONAL_TABLE.PROP_3
, <Concatenation/Array of JOURNEY_STEPS_TABLE> as "InterimStops"
FROM MAIN_TRIP_TABLE
INNER JOIN ADDITIONAL_TABLE ON MAIN_TRIP_TABLE.RECORD_ID = ADDITIONAL_TABLE.RECORD_ID
LEFT OUTER JOIN JOURNEY_STEPS_TABLE ON MAIN_TRIP_TABLE.RECORD_ID = JOURNEY_STEPS_TABLE.RECORD_ID
SELECT
MAIN_TRIP_TABLE.RECORD_ID
, LISTAGG(JOURNEY_STEPS_TABLE.LOCATION, ',') WITHIN GROUP (ORDER BY JOURNEY_STEPS_TABLE.STEP_NUMBER) "InterimStops"
FROM MAIN_TRIP_TABLE
LEFT OUTER JOIN JOURNEY_STEPS_TABLE ON MAIN_TRIP_TABLE.RECORD_ID = JOURNEY_STEPS_TABLE.RECORD_ID
GROUP BY MAIN_TRIP_TABLE.RECORD_ID
SELECT MAIN_TRIP_TABLE.RECORD_ID
, (SELECT LISTAGG(JOURNEY_STEPS_TABLE.LOCATION, ',') WITHIN GROUP (ORDER BY JOURNEY_STEPS_TABLE.STEP_NUMBER)
FROM JOURNEY_STEPS_TABLE
WHERE JOURNEY_STEPS_TABLE.RECORD_ID = MAIN_TRIP_TABLE.RECORD_ID) "InterimStops"
FROM MAIN_TRIP_TABLE
SELECT MAIN_TRIP_TABLE.RECORD_ID
, JOURNEY_STEPS_TABLE."InterimStops"
FROM MAIN_TRIP_TABLE
LEFT JOIN (SELECT RECORD_ID
, LISTAGG(LOCATION, ',') WITHIN GROUP (ORDER BY STEP_NUMBER) "InterimStops"
FROM JOURNEY_STEPS_TABLE
GROUP BY RECORD_ID) JOURNEY_STEPS_TABLE
ON JOURNEY_STEPS_TABLE.RECORD_ID = MAIN_TRIP_TABLE.RECORD_ID