跨库更新表中某一字段

本文介绍如何通过一条SQL语句实现从数据库A向数据库B的city表中更新gsuo_city_no字段的方法。两个数据库中的city表结构相同,但B库中的gsuo_city_no字段为空。文中提供了一个具体的SQL更新语句示例。

数据库A中有city表,字段如下CITY_no (not null), CITY, prvc, gsuo_city_no.

数据库B中也有city表,结构和A表一样。只不过gsuo_city_no字段全部为null。我想把数据库A中的gsuo_city_no用一条sql语句更新到B数据库中。

如下:

update [数据库A]..city set gsuo_city_no =
(select gsuo_city_no from 数据库B..city where [数据库A]..city.CITY_no=数据库B..city.CITY_no)

 

 

<think>在Oracle数据库中,要查询某个指定字段名(例如`EMPLOYEE_NAME`)存在于哪些中,可以使用系统提供的数据字典视图。以下是几种常用方法: ### 方法1:使用`ALL_TAB_COLUMNS`视图(推荐) 此视图显示当前用户有权限访问的所有的列信息。查询指定字段名(如`'EMPLOYEE_NAME'`)存在于哪些: ```sql SELECT OWNER, TABLE_NAME FROM ALL_TAB_COLUMNS WHERE COLUMN_NAME = 'EMPLOYEE_NAME'; -- 替换为你的字段名 ``` - **说明**: - `OWNER`:所属的用户(模式)。 - `TABLE_NAME`:包含该字段名。 - 大小写敏感:Oracle默认将字段名存储为大写。如果创建字段名用了小写或混合大小写,需用双引号包裹(如`"EmployeeName"`),此时查询时需匹配相同的大小写格式[^1][^2]。 ### 方法2:使用`USER_TAB_COLUMNS`视图(仅当前用户模式) 如果只想查询当前用户(模式)下的: ```sql SELECT TABLE_NAME FROM USER_TAB_COLUMNS WHERE COLUMN_NAME = 'EMPLOYEE_NAME'; ``` - **说明**:不返回`OWNER`字段,因为所有都属于当前用户。 ### 方法3:使用`DBA_TAB_COLUMNS`视图(需DBA权限) 如果需要查询整个数据库(包括所有用户)的: ```sql SELECT OWNER, TABLE_NAME FROM DBA_TAB_COLUMNS WHERE COLUMN_NAME = 'EMPLOYEE_NAME'; ``` - **权限要求**:当前用户需具有`SELECT ANY DICTIONARY`或`DBA`角色权限[^1]。 ### 注意事项 1. **字段名大小写**: - 如果字段名在创建时未用双引号包裹,Oracle会将其转为大写。例如,创建语句为`CREATE TABLE t (EmployeeName VARCHAR2(10));`,实际存储为`EMPLOYEENAME`。 - 若创建时用了双引号(如`"EmployeeName"`),则必须精确匹配大小写: ```sql SELECT TABLE_NAME FROM ALL_TAB_COLUMNS WHERE COLUMN_NAME = 'EmployeeName'; ``` 2. **模糊匹配**: 若不确定字段名的完整拼写,可用`LIKE`模糊查询: ```sql SELECT OWNER, TABLE_NAME, COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE COLUMN_NAME LIKE '%NAME%'; -- 查找包含"NAME"的字段 ``` ### 完整示例 假设查询字段`SALARY`在所有用户的存在情况: ```sql SELECT OWNER AS "所属用户", TABLE_NAME AS "名" FROM ALL_TAB_COLUMNS WHERE COLUMN_NAME = 'SALARY' ORDER BY OWNER, TABLE_NAME; ``` 输出示例: ``` 所属用户 名 ---------- ------------- HR EMPLOYEES HR JOB_HISTORY FINANCE PAYROLL ``` ### 性能说明 - 数据字典视图查询效率较高,但若数据库包含数十万张,首次查询可能稍慢(需缓存元数据)[^1][^4]。 通过以上方法,可快速定位字段数据库中的分布,便于数据溯源或重构分析[^1][^3]。 §§相关问题§§ 1. 如何查询Oracle数据库中包含特定字段名的所有视图(View)? 2. Oracle中如何批量导出所有包含某字段结构? 3. 如何检查Oracle中是否存在重复的字段名定义()?</think>在 Oracle 数据库中查询某个指定字段存在于哪些中,可以使用以下方法,主要基于 Oracle 的数据字典视图: ### 方法 1:使用 `ALL_TAB_COLUMNS` 视图(推荐) 此方法查询当前用户有权限访问的所有中包含指定字段: ```sql SELECT OWNER, TABLE_NAME FROM ALL_TAB_COLUMNS WHERE COLUMN_NAME = 'YOUR_COLUMN_NAME'; -- 替换为你的字段名 ``` - **说明**: - `OWNER`:所属的用户(模式) - `TABLE_NAME`:包含该字段名 - 大小写敏感:Oracle 默认将字段名存储为大写,所以查询时字段名应使用大写[^1][^2] ### 方法 2:使用 `USER_TAB_COLUMNS` 视图(仅当前用户模式) 如果只想查询当前用户拥有的: ```sql SELECT TABLE_NAME FROM USER_TAB_COLUMNS WHERE COLUMN_NAME = 'YOUR_COLUMN_NAME'; ``` ### 方法 3:使用 `DBA_TAB_COLUMNS` 视图(需 DBA 权限) 如果需要查询整个数据库(包括所有用户)的: ```sql SELECT OWNER, TABLE_NAME FROM DBA_TAB_COLUMNS WHERE COLUMN_NAME = 'YOUR_COLUMN_NAME'; ``` ### 注意事项: 1. **字段名大小写**: - 如果字段名在创建时未用双引号包裹,Oracle 会将其转为大写 - 若创建时用了双引号(如 `"EmployeeName"`),则需精确匹配大小写: ```sql SELECT TABLE_NAME FROM ALL_TAB_COLUMNS WHERE COLUMN_NAME = 'EmployeeName'; ``` 2. **模糊匹配**: 若不确定字段名的完整拼写,可用 `LIKE`: ```sql SELECT OWNER, TABLE_NAME, COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE COLUMN_NAME LIKE '%NAME%'; -- 查找包含"NAME"的字段 ``` 3. **指定所属用户**: ```sql SELECT TABLE_NAME FROM ALL_TAB_COLUMNS WHERE COLUMN_NAME = 'SALARY' AND OWNER = 'HR'; -- 只查询HR用户下的 ``` ### 完整示例: 查询字段 `EMPLOYEE_ID` 在哪些中存在: ```sql SELECT OWNER AS "Schema", TABLE_NAME AS "Table Name" FROM ALL_TAB_COLUMNS WHERE COLUMN_NAME = 'EMPLOYEE_ID' ORDER BY OWNER, TABLE_NAME; ``` 输出示例: ``` Schema Table Name ---------- ------------ HR DEPARTMENTS HR EMPLOYEES HR JOB_HISTORY SH SALES ``` ### 性能说明: - 这些数据字典视图查询效率较高,但若数据库包含数十万张,首次查询可能稍慢(需缓存元数据)[^1][^4] - 结果包含系统,可通过添加 `AND OWNER NOT IN ('SYS','SYSTEM')` 过滤 通过以上方法,您可以快速定位特定字段数据库中的分布情况[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚上吃酱牛肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值