【问题标题】:SQLAlchemy Coaslesce with Select subquerySQLAlchemy Coaslesce 与 Select 子查询
【发布时间】:2014-04-10 12:00:53
【问题描述】:

我正在尝试将以下 SQL 编写为 SQLAlchemy 查询:

SELECT COALESCE((
    SELECT client_id 
    FROM client_subclient_map m
    WHERE m.subclient_id = brands.client_id 
    LIMIT 1), 
    client_id)
FROM brands 
WHERE id = $1;

我目前有函数:

def client_subclient_map(self):
    return self.session.query(ClientSubclientMap).\
            filter(ClientSubclientMap.subclient_id==Brand.client_id).\
            limit(1).\
            subquery()

创建以下子查询:

SELECT client_subclient_map.client_id, client_subclient_map.subclient_id 
FROM client_subclient_map, brands 
WHERE client_subclient_map.subclient_id = brands.client_id
LIMIT :param_1

主要功能:

def top_client(self, brand_id):
    clientmap_alias = aliased(ClientSubclientMap, self.client_subclient_map())
    self.query = self.session.query(
                    func.coalesce(
                        clientmap_alias.client_id, Brand.client_id
                    )).\
                    filter(Brand.id==brand_id)
    print self.query
    return self

创建查询:

SELECT coalesce(:param_1, brands.client_id) AS coalesce_1 
FROM brands 
WHERE brands.id = :id_1

然后我就打电话

def get(self):
    return self.query.first()

合并后由我的函数创建的完整查询如下所示:

SELECT coalesce(anon_1.client_id, brands.client_id) AS coalesce_1 
FROM (
    SELECT client_subclient_map.client_id AS client_id, 
        client_subclient_map.subclient_id AS subclient_id 
    FROM client_subclient_map, brands 
    WHERE client_subclient_map.subclient_id = brands.client_id
    LIMIT :param_1) AS anon_1, 
    brands 
WHERE brands.id = :id_1

这是错误的,因为 select 子查询发生在错误的位置,它需要发生在 coalesce 函数内部而不是 FROM 子句中才能起作用。

我是 SQLAlchemy 的新手,所以它也可能是我设置中其他地方的一个问题。我确实在 ClientSubclientMap 表的 client_id 和 subclient_id 列上都有 ForeignKey 引用,但是两个外键引用同一列 Client.id 存在一些问题,因此我删除了 ClientSubclientMap.client 外键引用。

sqlalchemy.exc.AmbiguousForeignKeysError: Could not determine join condition 
between parent/child tables on relationship ClientSubclientMap.subclients - 
there are multiple foreign key paths linking the tables.  Specify the 
'foreign_keys' argument, providing a list of those columns which should be 
counted as containing a foreign key reference to the parent table.

【问题讨论】:

  • 该错误消息与您上面说明的代码无关。在您的映射中的某处,您有一个名为“子客户端”的关系附加到一个名为 ClientSubclientMap 的类,它需要更多关于如何加入其目标类的详细信息。当您找到该映射时,请参阅 handling multiple join paths 了解如何解决的背景信息。

标签: sqlalchemy foreign-keys subquery coalesce


【解决方案1】:

最终不得不将查询重写为JOIN,并使用CASE 语句作为解决方法。

def top_client(self, brand_id):
    self.query = self.session.query(case([(ClientSubclientMap.client_id==None, 
                                         Brand.client_id)],  
                                         else_=ClientSubclientMap.client_id))\
                    .outerjoin(ClientSubclientMap, 
                               Brand.client_id==ClientSubclientMap.subclient_id)\
                    .filter(Brand.id==brand_id)
    return self

构造查询:

SELECT 
    CASE 
        WHEN (client_subclient_map.client_id IS NULL) 
        THEN brands.client_id 
        ELSE client_subclient_map.client_id 
    END AS anon_1 
FROM brands 
    LEFT OUTER JOIN client_subclient_map 
        ON brands.client_id = client_subclient_map.subclient_id 
WHERE brands.id = :id_1

我仍然想知道如何在 COALESCE 函数中执行嵌套的 SELECT 语句,但如果有人可以提供帮助的话。

【讨论】:

    猜你喜欢
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2014-10-13
    相关资源
    最近更新 更多