- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是我的 mssql 代码片段
cnt = func.count(pvr_svc.ic_idn).label('cnt')
x = session.query(pvr_svc.inc_type_md, cnt, cast(pvr_svc.crt_dt,DATE)
.label('crt_dt'))
.filter(pvr_svc.inc_type_md.in_(['PM','OM','OP-HU']))
.group_by(cast(pvr_svc.crt_dt, DATE), pvr_svc.inc_type_md)
y = session.query(pvr_svc.inc_type_md, cnt, cast(pvr_svc.crt_dt,DATE)
.label('crt_dt'))
.filter(pvr_svc.gold_idn==2)
.group_by(cast(pvr_svc.crt_dt, DATE), pvr_svc.inc_type_md)
我想做的是
from sqlalchemy import union_all
u1 = x.union_all(y) # ----- 1
提取“u1”中的列名如下
>>>[i['name'] for i in u1.column_descriptions]
>>>['inc_type_md', 'cnt', 'crt_dt'] # column names
现在如果我想在未来使用'u1',这就是我要做的
>>>v1 = u1.subquery() #------ 2
我这样做是为了从“v1”访问列名
>>>v1.c.keys()
>>>[u'pvr_svc_inc_type_md', u'cnt', u'crt_dt']
现在,如果您看到“u1”和“v1”(u1 的子查询)中的第一个键是不同的。我希望它们相同。
为了避免这种情况,我会在“x”和“y”查询中标记列名
x = session.query(pvr_svc.inc_type_md.label('inc_type_md'), cnt, cast(pvr_svc.crt_dt,DATE).label('crt_dt')
.label('crt_dt'))
.filter(pvr_svc.inc_type_md.in_(['PM','OM','OP-HU']))
.group_by(cast(pvr_svc.crt_dt, DATE), pvr_svc.inc_type_md)
y = session.query(pvr_svc.inc_type_md.label('inc_type_md'), cnt, cast(pvr_svc.crt_dt,DATE).label('crt_dt')
.label('crt_dt'))
.filter(pvr_svc.gold_idn==2)
.group_by(cast(pvr_svc.crt_dt, DATE), pvr_svc.inc_type_md)
然后重复步骤 1 和 2,它工作正常。
现在我的问题是
我想用第三个查询“z”做一个“u1”的union_all,我在“z”中标记了列名
z = session.query(pvr_svc.inc_type_md.label('inc_type_md'), cnt, cast(pvr_svc.crt_dt,DATE).label('crt_dt')
.label('crt_dt'))
.filter(pvr_svc.gold_idn==4)
.group_by(cast(pvr_svc.crt_dt, DATE), pvr_svc.inc_type_md)
我会这样做来生成 3 个查询的 union_all
>>>union_xyz = u1.union_all(z)
现在我想在以后的查询中使用“union_xyz”,所以我从中创建了一个子查询
>>>sub_xyz = union_xyz.subquery()
现在的问题是,sub_xyz 中的列名以一些整数为前缀
所以,这就是我得到的,
>>>sub_xyz.c.keys()
>>>[u'%(2911061292 anon)s_inc_type_md', u'%(2911061292 anon)s_cnt', u'%(2911061292 anon)s_crt_dt']
如何避免列名的前缀?
我浏览了 sqlalchemy doc
我发现了一个类似的问题 How can I prevent sqlalchemy from prefixing the column names of a CTE?
最佳答案
我不知道有什么方法可以防止添加前缀,但您可以将子查询的 c
属性转换为列表或元组,然后按位置访问各个列。这里有一个使用元组解包的例子:
>>> inc_type_md_col, cnt_col, ctr_dt_col = tuple(subq_xyz.c)
inc_type_md_col
、cnt_col
和 ctr_dt_col
都是有效的列对象,您可以随意使用它们,例如
>>> session.query(inc_type_md_col).filter(cnt_col > 0)
关于python - SQL炼金术 : column name prefixed on the subquery of union_all of 3 tables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26405187/
我想使用 UNION_ALL 合并来自不同模式的表。这些表具有相同的架构,就像在这个玩具示例中一样: class1.names +----------+ | id | name| +---------
这是 mssql 代码片段 (Select column_name_1 from table_name_1 with(nolock) Where column_name_2='Y' UNION A
出于某种原因,当我使用 SQLAlchemy 的 union_all 和 .all() 时,它返回的项目数量不正确。 正如您在下面看到的,我将每一个都分解以查看错误所在。有谁知道为什么会发生这种情况?
这是我的 mssql 代码片段 cnt = func.count(pvr_svc.ic_idn).label('cnt') x = session.query(pvr_svc.inc_type_md,
我是一名优秀的程序员,十分优秀!