【问题标题】:Invalid identifier error when using RIGHT JOIN inside FROM clause在 FROM 子句中使用 RIGHT JOIN 时出现无效标识符错误
【发布时间】:2018-11-16 06:53:04
【问题描述】:

我想在 FROM 中使用 RIGHT JOIN 的 2 个表的子集(我想从该子集中使用 ID 不在 ITV2_HIST_VEHICULOS 中的 ITV2_VEHICULOS 的所有行),以便 SELECT "从那里获取”数据并使用WHERE 进行过滤

我的查询:

SELECT
    *
FROM
    ITV2_INSPECCIONES I,
    ITV2_HORAS_INSPECCION HI_FIN,
    ITV2_INSPECCIONES I_SIG,
    ITV2_HORAS_INSPECCION HI_SIG_INI,
    ITV2_HIST_VEHICULOS VH,
    ITV2_CATEGORIAS_VEHICULO CAT,
    ITV2_CLASIF_VEH_CONS CVC,
    ITV2_CLASIF_VEH_USO CVU,
    (
        SELECT
            *
        FROM
            ITV2_HIST_VEHICULOS VH
        RIGHT JOIN ITV2_VEHICULOS V ON
            VH.C_VEHICULO_ID = V.C_VEHICULO_ID
    ) VI 

WHERE
    I.C_TIPO_INSPECCION = 1     
    AND I.F_DESFAVORABLE IS NOT NULL
    AND I.C_RESULTADO IN(
        3,
        4
    )
    AND I.C_VEHICULO_ID = VI.C_VEHICULO_ID 
    AND VI.C_CATEGORIA_ID = CAT.C_CATEGORIA_ID
    AND VI.C_CLASIF_VEH_CONS_ID = CVC.C_CLASIF_VEH_CONS_ID
    AND VI.C_CLASIF_VEH_USO_ID = CVU.C_CLASIF_VEH_USO_ID -- HORAS  
    AND I.C_ESTACION_ID = HI_FIN.C_ESTACION_ID
    AND I.C_INSPECCION_ID = HI_FIN.C_INSPECCION_ID
    AND I.N_ANNO = HI_FIN.N_ANNO
    AND HI_FIN.C_TIPO_HORA_ID = 6 -- INSPECCION SIGUIENTE   
    AND I.C_ESTACION_ID = I_SIG.C_ESTACION_ID_FASE_ANT
    AND I.C_INSPECCION_ID = I_SIG.C_INSPECCION_ID_FASE_ANT
    AND I.N_ANNO = I_SIG.N_ANNO_FASE_ANT --    
    AND I_SIG.N_ANNO IN(
        2013,
        2014,
        2015,
        2016,
        2017,
        2018
    )
    AND I_SIG.C_ESTACION_ID IN(
        3,
        21,
        22,
        26,
        28,
        32,
        34,
        37,
        41,
        47,
        53,
        59,
        60
    )
    AND I_SIG.F_INSPECCION >= '01/09/2015'
    AND I_SIG.F_INSPECCION <= '30/09/2018' --

    AND I_SIG.F_DESFAVORABLE IS NULL
    AND I_SIG.C_RESULTADO IN(
        1,
        2
    ) -- Y HORAS

    AND I_SIG.C_ESTACION_ID = HI_SIG_INI.C_ESTACION_ID
    AND I_SIG.C_INSPECCION_ID = HI_SIG_INI.C_INSPECCION_ID
    AND I_SIG.N_ANNO = HI_SIG_INI.N_ANNO
    AND HI_SIG_INI.C_TIPO_HORA_ID = 1

 --GROUP BY...

我期望在输出中:

C_ESTACION_ID(FROM I) |C_VEHICULO_ID(FROM(I) |C_TIPO_HORA_ID(FROM HI_FIN)|F_HORA (FROM I_FIN) |A_MATRICULA FROM (V) | F_CAMBIO FROM (VH -> IF subdata of V EXISTS)
 ---------------------|----------------------|---------------------------|--------------------|---------------------|---------------------------------------

【问题讨论】:

  • stop 在 from 子句中的表名之间使用逗号,改为使用显式 ANSI 连接语法。
  • 我们不知道该查询中的无效标识符是什么。我们需要查看所有表 DDL。 complete 错误信息是什么?
  • @Used_By_Already 我刚刚在另一个方案中尝试过,它工作正常。难道我没有“权限”在另一个方案中运行连接吗?对不起,我是 sql 的半新手
  • 也许,我不能确定。听起来可能。但我恳请您学习如何使用“内连接”“左连接”“交叉连接”。
  • 添加一些示例表数据和预期结果 - 全部作为格式化文本,而不是图像。在你花太多时间之前,先看看stackoverflow.com/help/mcve

标签: sql oracle dbeaver


【解决方案1】:

如果您使用“显式连接语法”而不是表名之间的逗号,这就是您的查询的样子:

SELECT *
FROM ITV2_INSPECCIONES I
INNER JOIN ITV2_HORAS_INSPECCION HI_FIN ON I.C_ESTACION_ID = HI_FIN.C_ESTACION_ID
     AND I.C_INSPECCION_ID = HI_FIN.C_INSPECCION_ID
     AND I.N_ANNO = HI_FIN.N_ANNO
INNER JOIN ITV2_INSPECCIONES I_SIG ON I.C_ESTACION_ID = I_SIG.C_ESTACION_ID_FASE_ANT
     AND I.C_INSPECCION_ID = I_SIG.C_INSPECCION_ID_FASE_ANT
     AND I.N_ANNO = I_SIG.N_ANNO_FASE_ANT
INNER JOIN ITV2_HORAS_INSPECCION HI_SIG_INI ON I_SIG.C_ESTACION_ID = HI_SIG_INI.C_ESTACION_ID
     AND I_SIG.C_INSPECCION_ID = HI_SIG_INI.C_INSPECCION_ID
     AND I_SIG.N_ANNO = HI_SIG_INI.N_ANNO
WHERE I.C_TIPO_INSPECCION = 1
    AND I.F_DESFAVORABLE IS NOT NULL
    AND I.C_RESULTADO IN (3, 4)
    AND HI_FIN.C_TIPO_HORA_ID = 6 -- INSPECCION SIGUIENTE   
    AND HI_SIG_INI.C_TIPO_HORA_ID = 1
    AND I_SIG.F_INSPECCION >= '01/09/2015'
    AND I_SIG.F_INSPECCION <= '30/09/2018'
    AND I_SIG.F_DESFAVORABLE IS NULL
    AND I_SIG.N_ANNO IN (2013, 2014, 2015, 2016, 2017, 2018)
    AND I_SIG.C_ESTACION_ID IN (3, 21, 22, 26, 28, 32, 34, 37, 41, 47, 53, 59, 60)
    AND I_SIG.C_RESULTADO IN (1, 2) -- Y HORAS

现在我不得不从中提取几个表和子查询,因为坦率地说,它们对我来说没有多大意义:

ITV2_HIST_VEHICULOS VH,         << no join conditions to preceding tables
ITV2_CATEGORIAS_VEHICULO CAT,   << no join conditions to preceding tables
ITV2_CLASIF_VEH_CONS CVC,       << no join conditions to preceding tables
ITV2_CLASIF_VEH_USO CVU,        << no join conditions to preceding tables
(
    SELECT
        *
    FROM ITV2_VEHICULOS V
    LEFT JOIN ITV2_HIST_VEHICULOS VH ON
        VH.C_VEHICULO_ID = V.C_VEHICULO_ID
) VI
AND I.C_VEHICULO_ID = VI.C_VEHICULO_ID 
AND VI.C_CATEGORIA_ID = CAT.C_CATEGORIA_ID
AND VI.C_CLASIF_VEH_CONS_ID = CVC.C_CLASIF_VEH_CONS_ID
AND VI.C_CLASIF_VEH_USO_ID = CVU.C_CLASIF_VEH_USO_ID

【讨论】:

  • 但我需要ITV2_INSPECCIONES-&gt;ITV2_VEHICULOS-&gt;ITV2_HIST_VEHICULOS 的关系,我该如何关联它们?
  • 我有同样多的机会做你问的事情,就像预测下一个彩票号码会是什么一样。我为您所做的已确定您当前查询开始出现故障的位置,但我对您的表一无所知,我不能再进一步了。
  • 它们是包含大量数据的表,我不适合 SO。我会尝试合成它
  • @Raulitus:您不需要在表格中显示数据。您需要显示表定义(列)以及一个表中的哪一列与另一个表中的列相关(例如外键) - 这些将是连接条件所需的列
猜你喜欢
  • 1970-01-01
  • 2021-10-13
  • 2013-07-10
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多