Sql 如何返回由存储在多个记录中的值生成的单个值?

Sql 如何返回由存储在多个记录中的值生成的单个值?,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,不幸的是,我是一名应用程序开发人员,为了返回应用程序的数据,我需要编写(/update)SQL语句。我在SQL方面的经验有限,因此如果有任何帮助,我将不胜感激 我们有一个Oracle数据库11g(11.2.0.4.0) 示例表 我创建了下面的示例,它复制了我们的设置。它包括: 包含不同城市旅行记录的主表。(主跳闸表) 包含通过内部联接链接到这些行程的附加属性的各种附加表。(附加表格) 一个单独的表格,显示在旅程中采取的步骤(即访问的临时地点)。STEP_NUM=1的值始终是最终目的地,因此主表

不幸的是,我是一名应用程序开发人员,为了返回应用程序的数据,我需要编写(/update)SQL语句。我在SQL方面的经验有限,因此如果有任何帮助,我将不胜感激

我们有一个Oracle数据库11g(11.2.0.4.0)

示例表 我创建了下面的示例,它复制了我们的设置。它包括:

  • 包含不同城市旅行记录的主表。(主跳闸表)
  • 包含通过内部联接链接到这些行程的附加属性的各种附加表。(附加表格)
  • 一个单独的表格,显示在旅程中采取的步骤(即访问的临时地点)。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