随便贴一张网友的妙文:
今天有这样一个需求:因为要加快查询速度,避免表的联合查询的效率问题,所以要把一个表的几个字段填到另一个表的几个字段上去。
一开始做法如下:
update tbl1 a, tbl2 b set a.col1=b.col1,a.col2=b.col2 where a.key=b.key
这个语句在 MySQL 上是可以运行的,但在 ORACLE 上无法执行。在网上查了一个发现可以这样:
update tbl1 a
set a.col1=(select b.col1 from tbl2 b where a.key=b.key),
a.col2=(select b.col2 from tbl2 b where a.key=b.key)
但我感觉这样的效率好像比较低,写得SQL又很长,更新一行数据要写两个嵌套,直观上感觉 "select xxx from tbl2 b where a.key=b.key" 语句好像被执行了两遍(实际我没有测试验证)。于是接着在网上搜,查到一个比较好看的写法,如下:
update tbl1 a
set (a.col1, a.col2) = (select b.col1, b.col2
from tbl2 b
where a.key = b.key)
这种写法感觉还比较满意。但注意了,经过测试,这种语法在 MySQL 中是不合法的。
今天继续使用最后这个SQL的时候,也发现了一些缺点:如果 tbl1.key 的值在 tbl2.key 中没有此值是,这个更新的两个字段 tbl1.col1 和 tbl1.col2 字段会被更新为空值(null)。这个结果是我不想看到的。也是没办法解决的。如果想解决的话,也可以在最后加入一个条件,如下表中加大字体的部分:
update tbl1 a
set (a.col1, a.col2) = (select b.col1, b.col2
from tbl2 b
where a.key = b.key)
where a.key in(select key from tbl2)
但这种做法肯定会导致性能严重下降。所以,我写一个更复杂的方法来解决这个问题,现在没时间。。。
分享到:
相关推荐
我们想将该表转换为一个新的表格,其中每一行对应一个学生,列对应不同的课程,而单元格中的值对应该学生在该课程中的分数。 SQL SERVER 2000 静态 SQL 在SQL Server 2000中,我们可以使用CASE WHEN语句和MAX聚合...
5. 无效的标识符(90442000):当我们尝试使用一个无效的标识符时,Oracle 将抛出这个错误代码。例如,如果我们尝试访问一个名为 " empname" 的列,而该列并不存在于 emp 表中,将导致该错误。 示例代码:SELECT ...
假设我们有一个员工表,其中包含部门编号、员工姓名和薪资等信息,现在需要按部门对员工薪资进行排名,并将每个部门薪资排名前三的员工姓名转换到同一行。 **原始数据表结构如下:** | DEPTNO | ENAME | SAL | |--...
在Oracle数据库中,当需要将一个表的字段值更新到另一个表时,通常可以使用`MERGE INTO`语句来实现。`MERGE INTO`是一个非常强大的SQL操作,它结合了`INSERT`、`UPDATE`和`DELETE`的功能,允许你在匹配条件的基础上...
在Oracle数据库中,如何查找,定位一张表最后一次的DML操作的时间呢? 方式有三种,不过都有一些局限性,下面简单的解析、总结一下。 1:使用ORA_ROWSCN伪列获取表最后的DML时间 ORA_ROWSCN伪列是Oracle 10g开始...
例如,如果需要在更新部门名称时自动更新所有关联的员工记录,可以创建一个触发器来完成这个任务。但这需要谨慎使用,因为触发器可能导致未预期的行为。 在执行这类操作时,务必注意以下几点: - **事务管理**:...
同时,设置一个用户注销触发器,在会话结束时删除对应SessionID的记录。在插入数据时,同时写入当前会话ID。在读取数据时,只查询与当前会话ID匹配的记录。 此外,可以扩展这个设计,比如创建一个视图,视图的筛选...
删除重复记录时,可以使用MIN(ROWID)来保留每个组的第一个记录,删除其他重复项。 总之,Oracle的伪列和伪表是数据库操作中的重要工具。ROWID提供了对记录物理位置的直接访问,有助于提高查询和更新的效率。DUAL表...
` 该命令用于收集并更新表的统计信息,这对优化查询计划非常有帮助。 - **查询表使用的extent信息**:`SELECT extent_id, bytes FROM dba_extents WHERE segment_name = 'CUSTOMERS' AND segment_type = 'TABLE' ...
Oracle使用一个或多个行片段来存储表的每一行数据的前255列。当一个数据块可以容纳一个完整的数据行时(且表的列数小于等于256),那么此行就可以使用一个行片段来存储。当插入一个数据行,或更新已有数据行时,数据...
**rowid** 也是Oracle数据库中的一个重要伪列,它表示表中每行记录的物理地址。与rownum不同的是,rowid对于表中的每一行都是唯一的,并且指向该行数据的实际存储位置。 ##### rowid的特点: 1. **唯一性**:rowid...
DUAL表是Oracle提供的一种特殊表,通常只有一行,用于在SELECT语句中提供一个虚拟的记录集,以确保语句的完整性。例如,查询当前日期和时间可以写成`SELECT sysdate, to_char(sysdate, 'yyyy-mm-dd HH24:mm:ss') ...
比如,一个员工信息表中,有多个技能列(如“编程”、“设计”等),如果要将这些技能列展开为行记录,以便查看每个员工具备哪些技能,就可以使用UNPIVOT。 在Oracle Developer中,可能提供了图形化的界面来辅助...
3. `ROWID`:这是Oracle中最常用的伪列之一,它是一个唯一标识每条记录物理位置的字符串。虽然不存储在表中,但在查询时可以获取,用于快速定位和访问数据。 4. `ROWNUM`:这个伪列用于限制查询结果集的大小。它会...
- 对另一个表(外部表)的连接列进行哈希运算,然后查找匹配的哈希值。 - 这种方法在内部表可以完全装入内存,且连接列分布均匀时效率最佳。 在进行表连接时,选择正确的连接方式至关重要。Oracle 查询优化器会...
Oracle是一款广泛使用的商业关系型数据库管理系统,而StarRocks和Doris则属于高性能的列式存储数据分析引擎,常用于大数据分析场景。本文将详细介绍如何在C#环境下处理Oracle到StarRocks的表结构迁移。 首先,让...
- `columnRowData`: 是一个字典类型,键为列名,值为该列对应的多个行数据组成的数组。这种设计可以方便地组织待插入的数据。 - **异常处理** - 如果`tableName`为空,则抛出`ArgumentNullException`。 - 如果`...
#### 一、查询某个表在哪些存储过程中被使用 为了高效地了解某个特定表在哪些存储过程中被引用,可以通过以下SQL查询来实现: ```sql SELECT A.NAME AS 过程名称, MIN(A.LINE) AS 首次出现行数 FROM USER_SOURCE A...
在数据库管理中,查询索引对应的表和列是一项基本但重要的技能,它有助于优化查询性能、维护数据库结构以及解决各种数据处理问题。根据给定的文件信息,我们将深入探讨如何查询索引及其关联的表和列,特别是通过两种...