【问题标题】:Unknow column 'ColumnName' in ON clauseON 子句中的未知列“ColumnName”
【发布时间】:2018-02-07 16:27:55
【问题描述】:

我正在使用 SQLAlchemy,在生成的 SQL 查询中出现以下错误。我有表 relaciones_laborales 需要与两个表 funciones_relacion_laboral 与字段 RelLabIdpuestos 与字段 PuestoId 连接。

join=(relaciones_laborales.join(
    funciones_relacion_laboral.join(
        funciones_asignadas.join(
            sillas.join(
                silla_grupo_materia.join(
                    puestos, (relaciones_laborales.c.PuestoId ==
                              puestos.c.PuestoId)),
                sillas.c.SillaId == silla_grupo_materia.c.SillaId,
                isouter=True),
            sillas.c.SillaId == funciones_asignadas.c.SillaId),
        (funciones_asignadas.c.FuncAsignadaId ==
         funciones_relacion_laboral.c.FuncAsignadaId)),
    relaciones_laborales.c.RelLabId == funciones_relacion_laboral.c.RelLabId)) 

然后我用

构造查询
query = sa.select(...).select_from(join)

我收到以下错误:

1054, u"Unknown column 'RELACIONES_LABORALES.PuestoId' in 'on clause'"

【问题讨论】:

    标签: python mysql sqlalchemy


    【解决方案1】:

    为了清楚起见,让我们使用一个更简单的例子。给定表 xyz

    x, y, z = [Table(t, metadata, Column('i', Integer))
               for t in ['x', 'y', 'z']]
    

    语句如

    j = x.join(y.join(z, x.c.i == z.c.i), y.c.i == x.c.i)
    

    产生一个编译成的 SQL 表达式对象

    x JOIN (y JOIN z ON x.i = z.i) ON y.i = x.i
    

    因为最里面的表达式首先被计算,作为参数传递给封闭的函数调用,依此类推。括号中的连接优先,但此时没有可见的表 x。另一方面,如果您稍微改变一下形成连接的方式并将它们链接起来:

    j = x.\
        join(y, y.c.i == x.c.i).\
        join(z, z.c.i == x.c.i)
    

    你得到

    x JOIN y ON y.i = x.i JOIN z ON z.i = x.i
    

    这可能是你所追求的。所以考虑到这一点:

    join = (
        relaciones_laborales.
    
        join(funciones_relacion_laboral,
             relaciones_laborales.c.RelLabId ==
             funciones_relacion_laboral.c.RelLabId).
    
        join(funciones_asignadas,
             funciones_asignadas.c.FuncAsignadaId ==
             funciones_relacion_laboral.c.FuncAsignadaId).
    
        join(sillas,
             sillas.c.SillaId == funciones_asignadas.c.SillaId).
    
        join(silla_grupo_materia,
             sillas.c.SillaId == silla_grupo_materia.c.SillaId,
             isouter=True).
    
        join(puestos,
             relaciones_laborales.c.PuestoId == puestos.c.PuestoId)
    )
    

    【讨论】:

    • 我将与 puestos 的联接附加到最后一个括号之后并且效果很好,因为 puestos 与其他联接的结果表联接。谢谢,我认为您的解决方案更好。
    猜你喜欢
    • 2021-07-02
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 2013-01-26
    相关资源
    最近更新 更多