Python 使用SQLAlchemy在嵌套子查询中使用顶级项

Python 使用SQLAlchemy在嵌套子查询中使用顶级项,python,sql,sqlalchemy,Python,Sql,Sqlalchemy,当我试图查找两个表之间的链接时,我有一个查询,但我需要对同一查询中的关联表进行一些检查。我认为我的问题源于必须检查多个级别的关系,我想根据顶级项筛选子查询,但我遇到了一个问题,不知道如何继续 更具体地说,我想使用应用程序的名称查询脚本,但将结果缩小到应用程序的语言与脚本的语言匹配的时间 表格:脚本(id,语言\u id),应用程序(id,名称),语言(id) 关联表:应用程序语言(应用程序id,语言id),脚本应用程序(脚本id,应用程序id) 当前尝试:(重要的是,这将保留为单个查询) 结果S

当我试图查找两个表之间的链接时,我有一个查询,但我需要对同一查询中的关联表进行一些检查。我认为我的问题源于必须检查多个级别的关系,我想根据顶级项筛选子查询,但我遇到了一个问题,不知道如何继续

更具体地说,我想使用
应用程序的名称查询
脚本
,但将结果缩小到
应用程序的
语言
脚本的
语言
匹配的时间

表格:
脚本(id,语言\u id)
应用程序(id,名称)
语言(id)

关联表:
应用程序语言(应用程序id,语言id)
脚本应用程序(脚本id,应用程序id)

当前尝试:(重要的是,这将保留为单个查询)

结果SQL代码:

SELECT script.id AS script_id
FROM script
WHERE script.id IN (SELECT script_application.script_id
FROM script_application
WHERE script_application.application_id IN (SELECT application.id
FROM application
WHERE application.name = ?) AND script_application.application_id IN (SELECT application_language.application_id
FROM application_language, script
WHERE script.language_id = application_language.language_id))
我的理论

我相信问题出在
ApplicationLanguage.language\u id==Script.language\u id
,因为如果我将其更改为(
ApplicationLanguage.language\u id==3
,3是我期望的值),那么它就可以完美地工作。在SQL代码中,我假设是来自应用程序的
语言script
覆盖了顶层
脚本


我将如何重新安排或修复此查询?我目前的方法在跨越单一关系时似乎很有效,但如果我尝试做更复杂的事情,它就不起作用。

我仍然想知道如何修复原始查询,因为我相信它将来会有用,但我设法重新安排了它

我反转了
lang\u search
,从
app\u search
中获取每个应用程序的语言,并将其用作最终查询的一部分,而不是尝试将其组合到子查询中

value = 'appname'

app_search = select([Application.id]).where(Application.name==value).as_scalar()

lang_search = select([ApplicationLanguage.language_id]).where(
    ApplicationLanguage.app_id.in(app_search)
).as_scalar()

script_search = select([ScriptApplication.script_id]).where(and_(
    ScriptApplication.app_id.in(app_search),
)).as_scalar()

query = and_(
    Script.id.in_(script_search),
    Script.language_id.in_(lang_search),
)
最终SQL查询:

SELECT script.id AS script_id
FROM script
WHERE script.id IN (SELECT script_application.script_id
FROM script_application
WHERE script_application.application_id IN (SELECT application.id
FROM application
WHERE lower(application.name) = ?)) AND script.language_id IN (SELECT application_language.language_id
FROM application_language
WHERE application_language.application_id IN (SELECT application.id
FROM application
WHERE lower(application.name) = ?))
SELECT script.id AS script_id
FROM script
WHERE script.id IN (SELECT script_application.script_id
FROM script_application
WHERE script_application.application_id IN (SELECT application.id
FROM application
WHERE lower(application.name) = ?)) AND script.language_id IN (SELECT application_language.language_id
FROM application_language
WHERE application_language.application_id IN (SELECT application.id
FROM application
WHERE lower(application.name) = ?))