获取子查询中的行值

1 oracle oracle-11g-r2

我需要计算日期之间的天数。我有这个查询,它获取问题解决的日期。子查询选择创建问题的日期。

问题是子查询会查询所有已打开问题的日期,而不是获取具有相同问题的日期INCIDENCIA.ID_INCIDENCIA

SELECT 
  INCIDENCIA.ID_INCIDENCIA AS Incidencia,
  INCIDENCIA.DESCRIPCION,
  SITUACION.FECHA,
  SITUACION.FECHA - Inicio.Fecha AS Dias
FROM
  INCIDENCIA,
  SITUACION,
  (SELECT SITUACION.FECHA AS Fecha 
    FROM SITUACION, INCIDENCIA
    WHERE SITUACION.ID_ESTADO = '1' AND INCIDENCIA.ID_INCIDENCIA = SITUACION.ID_INCIDENCIA) Inicio
WHERE
  SITUACION.ID_ESTADO = '3' AND
  INCIDENCIA.ID_INCIDENCIA = SITUACION.ID_INCIDENCIA
ORDER BY
  INCIDENCIA.ID_INCIDENCIA ASC
Run Code Online (Sandbox Code Playgroud)

预期的结果是:

???????????????????????????????????????????????????
? 1 ? 13 年 10 月 16 日?Averia 路由器 ? 30 ?
? 2 ? 16 年 11 月 16 日?法洛红?28 ?
? 3 ? 22/10/16 ?萨拉请求?37 ?
? 4 ? 19 年 10 月 16 日?Averia ordenador ? 0 ?
? 5 ? 16 年 10 月 29 日?Averia 罪决定因素 ? 1 ?
? 6 ? 10 年 1 月 17 日?Averia conexion ? 136?
???????????????????????????????????????????????????

但我得到了:

???????????????????????????????????????????????????
? 1 ? Averia 路由器 ? 13 年 10 月 16 日?30 ?
? 1 ? Averia 路由器 ? 13 年 10 月 16 日?-6 ?
? 1 ? Averia 路由器 ? 13 年 10 月 16 日?28 ?
? 1 ? Averia 路由器 ? 13 年 10 月 16 日?-6 ?
? 1 ? Averia 路由器 ? 13 年 10 月 16 日?-15 ?
? 1 ? Averia 路由器 ? 13 年 10 月 16 日?47 ?
? 2 ? 法洛红?16 年 11 月 16 日?64 ?
? 2 ? 法洛红?16 年 11 月 16 日?28 ?
? 2 ? 法洛红?16 年 11 月 16 日?62 ?
? 2 ? 法洛红?16 年 11 月 16 日?28 ?
? 2 ? 法洛红?16 年 11 月 16 日?19 ?
? 2 ? 法洛红?16 年 11 月 16 日?81 ?
? 3 ? 萨拉请求?22/10/16 ?39 ?
? 3 ? 萨拉请求?22/10/16 ?3 ?
? 3 ? 萨拉请求?22/10/16 ?37 ?
? 3 ? 萨拉请求?22/10/16 ?3 ?
? 3 ? 萨拉请求?22/10/16 ?-6 ?
? 3 ? 萨拉请求?22/10/16 ?56 ?
? 4 ? Averia ordenador ? 19 年 10 月 16 日?36 ?
? 4 ? Averia ordenador ? 19 年 10 月 16 日?0 ?
? 4 ? Averia ordenador ? 19 年 10 月 16 日?34 ?
? 4 ? Averia ordenador ? 19 年 10 月 16 日?0 ?
? 4 ? Averia ordenador ? 19 年 10 月 16 日?-9 ?
? 4 ? Averia ordenador ? 19 年 10 月 16 日?53 ?
? 5 ? Averia 罪决定因素 ? 16 年 10 月 29 日?46 ?
? 5 ? Averia 罪决定因素 ? 16 年 10 月 29 日?10 ?
? 5 ? Averia 罪决定因素 ? 16 年 10 月 29 日?44 ?
? 5 ? Averia 罪决定因素 ? 16 年 10 月 29 日?10 ?
? 5 ? Averia 罪决定因素 ? 16 年 10 月 29 日?1 ?
? 5 ? Averia 罪决定因素 ? 16 年 10 月 29 日?63 ?
? 6 ? Averia conexion ? 10 年 1 月 17 日?119?
? 6 ? Averia conexion ? 10 年 1 月 17 日?83 ?
? 6 ? Averia conexion ? 10 年 1 月 17 日?117?
? 6 ? Averia conexion ? 10 年 1 月 17 日?83 ?
? 6 ? Averia conexion ? 10 年 1 月 17 日?74 ?
? 6 ? Averia conexion ? 10 年 1 月 17 日?136?
???????????????????????????????????????????????????

Bal*_*app 5

您的子查询与外部查询无关,因此它将行乘以它返回的行数。此外,在我看来,在多个查询级别多次使用相同的表名而没有别名是不好的做法,因为它可能会导致一些意想不到的“惊喜”。您的查询应该是这样的:

SELECT 
  i1.ID_INCIDENCIA AS Incidencia,
  i1.DESCRIPCION,
  s1.FECHA,
  s1.FECHA - Inicio.Fecha AS Dias
FROM
  INCIDENCIA i1,
  SITUACION s1,
  (SELECT i2.ID_INCIDENCIA as Inicio_ID_INCIDENCIA, s2.FECHA AS Fecha 
    FROM SITUACION s2, INCIDENCIA i2
    WHERE s2.ID_ESTADO = '1' AND i2.ID_INCIDENCIA = s2.ID_INCIDENCIA) Inicio
WHERE
  s1.ID_ESTADO = '3' AND
  i1.ID_INCIDENCIA = s1.ID_INCIDENCIA
  AND Inicio.Inicio_ID_INCIDENCIA = i1.ID_INCIDENCIA
ORDER BY
  i1.ID_INCIDENCIA ASC
Run Code Online (Sandbox Code Playgroud)

ID_INCIDENCIA在子查询内的所有位置添加别名,因此可以根据该列将其连接到外部查询。

  • 也可以完全删除`i2`。 (2认同)