Power_Point PPT 居中

本文介绍了一种简单的方法来实现图片的居中对齐。首先确保图片的左边界与页面左侧对齐,接着通过调整图片的位置属性实现水平居中效果。

首先,图片中线对准左边框

然后,设置图片格式->位置->水平->度量依据->居中

 

参考:

http://www.brblog.cn/u/116/archives/2009/645.html

<think>我们有两个表:sp_power_zone 和 sp_electric_report_config。 目标:将sp_electric_report_config表中的POINT_CONFIG_ID更新到sp_power_zone表的POINT_CONFIG_IDs字段(以JSON数组形式存储) 条件: 1. sp_power_zone.zone_name 等于 sp_electric_report_config.level1 2. sp_power_zone.FUNCTION_NAME 等于 sp_electric_report_config.level2 3. sp_power_zone.ZONE_INDEX 等于 sp_electric_report_config.ZONE_INDEX 注意:sp_power_zone表中的POINT_CONFIG_IDs字段存储的是JSON数组。我们需要将匹配的sp_electric_report_config中的POINT_CONFIG_ID以JSON数组的形式更新到该字段。 然而,一个关键点是:一个sp_power_zone记录可能对应多个sp_electric_report_config记录(即一个区域可能有多个配置点),因此我们需要将多个POINT_CONFIG_ID聚合为一个JSON数组。 步骤: 1. 我们需要先根据条件关联两个表,然后按sp_power_zone的主键(或能唯一标识sp_power_zone记录的条件)分组,并将匹配的POINT_CONFIG_ID收集成一个数组。 2. 然后,我们将这个数组转换成JSON数组(在PostgreSQL中,我们可以使用json_agg或jsonb_agg函数)。 3. 最后,用这个JSON数组更新sp_power_zone的POINT_CONFIG_IDs字段。 假设我们使用PostgreSQL(因为引用中提到了GP,即Greenplum,它是基于PostgreSQL的),我们可以这样写: 首先,我们需要一个子查询(或CTE)来获取每个sp_power_zone记录对应的所有POINT_CONFIG_ID的JSON数组。 注意:由于我们是以sp_power_zone的记录为基准,所以应该按sp_power_zone的主键(假设为id)分组。 但是,问题中没有给出表的主键,所以我们需要假设有唯一标识sp_power_zone记录的方式。如果没有主键,我们可以用zone_name, FUNCTION_NAME, ZONE_INDEX来唯一确定吗?不一定,因为可能有多个记录具有相同的这三个值。所以我们需要知道表的主键。 由于问题没有提供表结构,我们假设sp_power_zone有一个主键字段id。如果没有,则需要根据实际情况调整。 更新语句可以这样写: ```sql WITH config_agg AS ( SELECT pz.id, jsonb_agg(erc.POINT_CONFIG_ID) AS new_config_ids -- 或者使用json_agg,取决于你想要json还是jsonb类型 FROM sp_power_zone pz INNER JOIN sp_electric_report_config erc ON pz.zone_name = erc.level1 AND pz.FUNCTION_NAME = erc.level2 AND pz.ZONE_INDEX = erc.ZONE_INDEX GROUP BY pz.id ) UPDATE sp_power_zone SET POINT_CONFIG_IDs = config_agg.new_config_ids FROM config_agg WHERE sp_power_zone.id = config_agg.id; ``` 但是,这里有一个问题:如果某个sp_power_zone记录没有匹配的sp_electric_report_config记录,那么它在CTE中就不会出现,因此不会被更新。也就是说,原本有值的POINT_CONFIG_IDs字段如果现在没有匹配,则不会被置为空数组。 如果我们希望将没有匹配的记录置为空数组,可以使用左连接: ```sql WITH config_agg AS ( SELECT pz.id, jsonb_agg(erc.POINT_CONFIG_ID) AS new_config_ids FROM sp_power_zone pz LEFT JOIN sp_electric_report_config erc ON pz.zone_name = erc.level1 AND pz.FUNCTION_NAME = erc.level2 AND pz.ZONE_INDEX = erc.ZONE_INDEX GROUP BY pz.id ) UPDATE sp_power_zone SET POINT_CONFIG_IDs = COALESCE(config_agg.new_config_ids, '[]'::jsonb) -- 如果是jsonb,这里用jsonb;如果是json,则用json FROM config_agg WHERE sp_power_zone.id = config_agg.id; ``` 注意:jsonb_agg在没有匹配的情况下会返回NULL,所以我们用COALESCE将其转换为空数组。 但是,这个更新会更新整个表,如果表很大,可能性能有影响。另外,如果只想更新部分记录,可以在CTE中加入WHERE条件。 另外,如果sp_power_zone表中没有id字段,那么我们需要使用其他能够唯一标识记录的字段。例如,如果zone_name, FUNCTION_NAME, ZONE_index组合可以唯一确定,我们可以用这些字段分组,然后在更新时用这些字段匹配。但是这样更新会比较复杂,因为需要多个字段来匹配。 假设没有主键id,我们可以这样: ```sql WITH config_agg AS ( SELECT pz.zone_name, pz.FUNCTION_NAME, pz.ZONE_INDEX, jsonb_agg(erc.POINT_CONFIG_ID) AS new_config_ids FROM sp_power_zone pz LEFT JOIN sp_electric_report_config erc ON pz.zone_name = erc.level1 AND pz.FUNCTION_NAME = erc.level2 AND pz.ZONE_INDEX = erc.ZONE_INDEX GROUP BY pz.zone_name, pz.FUNCTION_NAME, pz.ZONE_INDEX ) UPDATE sp_power_zone SET POINT_CONFIG_IDs = COALESCE(config_agg.new_config_ids, '[]'::jsonb) FROM config_agg WHERE sp_power_zone.zone_name = config_agg.zone_name AND sp_power_zone.FUNCTION_NAME = config_agg.FUNCTION_NAME AND sp_power_zone.ZONE_INDEX = config_agg.ZONE_INDEX; ``` 这样,我们通过三个字段进行匹配更新。 注意:如果这三个字段在sp_power_zone表中不是唯一的,那么CTE中分组后的记录数会少于sp_power_zone的记录数(因为分组将多个记录合并了),这样更新就会出错(因为一个分组对应多个记录,而更新时无法确定更新哪一条)。所以,必须确保这三个字段能唯一确定sp_power_zone中的记录,或者我们就是希望将相同这三个字段的所有记录更新为相同的JSON数组。 如果确实有重复,并且我们希望每个记录都更新为它自己匹配的配置(而不是整个分组),那么我们必须使用主键。所以,最好还是使用主键。 因此,在实际操作前,请确认sp_power_zone表的主键或唯一键。 另外,关于JSON数组:我们使用了jsonb_agg,它会创建一个jsonb数组。如果字段类型是json,则用json_agg。另外,如果POINT_CONFIG_ID是文本类型,那么数组中的元素就是文本;如果是整数,那么就是整数。 最后,请注意:这个更新操作会替换掉sp_power_zone表中所有记录的POINT_CONFIG_IDs字段(根据匹配情况)。如果只想更新部分记录,可以在CTE的JOIN条件中加入额外的过滤条件。 由于引用中提到了GP(Greenplum),而Greenplum是基于PostgreSQL的,所以上述语法应该适用。但请注意Greenplum的版本,有些函数可能不支持。 另外,引用[1]中提到了substring函数的问题,但这里我们并没有使用substring,所以不用担心。 如果实际环境中没有json_agg或jsonb_agg函数(例如使用较老的PostgreSQL版本),则可以考虑使用array_agg先聚合成数组,然后转换成json数组。例如: ```sql json_agg(erc.POINT_CONFIG_ID) -- 这个在9.4以上版本支持 -- 或者 to_json(array_agg(erc.POINT_CONFIG_ID)) -- 这样也可以 ``` 在Greenplum中,json_agg和jsonb_agg在较新的版本中应该支持。 如果遇到问题,请检查数据库版本和函数支持情况。 现在,我们写出完整的SQL语句(假设使用主键id): ```sql WITH config_agg AS ( SELECT pz.id, jsonb_agg(erc.POINT_CONFIG_ID) AS new_config_ids FROM sp_power_zone pz LEFT JOIN sp_electric_report_config erc ON pz.zone_name = erc.level1 AND pz.FUNCTION_NAME = erc.level2 AND pz.ZONE_INDEX = erc.ZONE_INDEX GROUP BY pz.id ) UPDATE sp_power_zone SET POINT_CONFIG_IDs = COALESCE(config_agg.new_config_ids, '[]'::jsonb) FROM config_agg WHERE sp_power_zone.id = config_agg.id; ``` 如果没有主键,则使用三个字段: ```sql WITH config_agg AS ( SELECT pz.zone_name, pz.FUNCTION_NAME, pz.ZONE_INDEX, jsonb_agg(erc.POINT_CONFIG_ID) AS new_config_ids FROM sp_power_zone pz LEFT JOIN sp_electric_report_config erc ON pz.zone_name = erc.level1 AND pz.FUNCTION_NAME = erc.level2 AND pz.ZONE_INDEX = erc.ZONE_INDEX GROUP BY pz.zone_name, pz.FUNCTION_NAME, pz.ZONE_INDEX ) UPDATE sp_power_zone SET POINT_CONFIG_IDs = COALESCE(config_agg.new_config_ids, '[]'::jsonb) FROM config_agg WHERE sp_power_zone.zone_name = config_agg.zone_name AND sp_power_zone.FUNCTION_NAME = config_agg.FUNCTION_NAME AND sp_power_zone.ZONE_INDEX = config_agg.ZONE_INDEX; ``` 请根据实际情况选择。 另外,如果更新前需要查看将要更新的数据,可以先运行CTE部分进行验证。 例如: ```sql SELECT pz.id, jsonb_agg(erc.POINT_CONFIG_ID) AS new_config_ids FROM sp_power_zone pz LEFT JOIN sp_electric_report_config erc ON pz.zone_name = erc.level1 AND pz.FUNCTION_NAME = erc.level2 AND pz.ZONE_INDEX = erc.ZONE_INDEX GROUP BY pz.id; ``` 这样可以看到每个id对应的新JSON数组。 最后,执行更新前请备份数据。 希望这个回答能帮助您解决问题。</think>以下是根据您的需求编写的SQL实现方案,基于PostgreSQL/Greenplum语法(参考引用[1]中的GP环境): ### SQL实现方案 ```sql WITH config_aggregate AS ( SELECT pz.id AS zone_id, JSONB_AGG(erc.POINT_CONFIG_ID) AS aggregated_ids -- 聚合匹配的配置ID为JSON数组 FROM sp_power_zone pz INNER JOIN sp_electric_report_config erc ON pz.zone_name = erc.level1 AND pz.FUNCTION_NAME = erc.level2 AND pz.ZONE_INDEX = erc.ZONE_INDEX GROUP BY pz.id -- 按区域ID分组聚合 ) UPDATE sp_power_zone SET POINT_CONFIG_IDs = ca.aggregated_ids FROM config_aggregate ca WHERE sp_power_zone.id = ca.zone_id; ``` ### 关键说明: 1. **关联逻辑**: - `zone_name = level1` - `FUNCTION_NAME = level2` - `ZONE_INDEX` 相等 - 使用`INNER JOIN`确保只更新匹配记录 2. **JSON数组处理**: - 使用 `JSONB_AGG()` 函数聚合多个匹配的POINT_CONFIG_ID(如无匹配则返回空数组) - 若需纯JSON格式可改用 `JSON_AGG()` 3. **更新机制**: - 通过CTE(`WITH`子句)先聚合配置ID - 使用聚合结果批量更新目标表 - 按主键`id`确保精准更新(假设`sp_power_zone`有主键) 4. **空值处理**: - 如需将无匹配记录的字段设为空数组,可修改CTE为: ```sql LEFT JOIN ... COALESCE(JSONB_AGG(erc.POINT_CONFIG_ID), '[]'::JSONB) ``` ### 注意事项: 1. **索引优化**:建议在关联字段上创建索引(尤其大数据量表): ```sql CREATE INDEX idx_config_keys ON sp_electric_report_config(level1, level2, ZONE_INDEX); ``` 2. **GP兼容性**:Greenplum完全支持`JSONB_AGG`(PG 9.4+),如遇函数不存在错误(参考引用[1]),可改用: ```sql JSON_AGG(erc.POINT_CONFIG_ID)::JSONB ``` 3. **数据验证**:执行前建议先预览聚合结果: ```sql SELECT * FROM config_aggregate LIMIT 10; ``` 4. **事务安全**:在事务中执行更新以便回滚: ```sql BEGIN; -- 更新语句 ROLLBACK; -- 或 COMMIT; ``` ### 相关问题 1. 如何验证JSON数组更新后的数据完整性? 2. 如果两个表存在多对多关系,此方案会产生什么影响? 3. 在Greenplum分布式环境中,如何优化此更新操作的性能? 4. 如何将JSON数组字段用于后续的聚合查询? [^1]: 引用自GP数据库函数兼容性说明 [^2]: 引用自Metasploit参数设置文档 [^3]: 引用自全局参数配置保存方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值