1、加索引
方式一:
要为Oracle数据库中的具体字段加索引,可以按照以下步骤操作:
-
确认需要添加索引的字段:首先,确定哪些字段需要添加索引。通常情况下,需要为经常被查询的字段添加索引,例如常用于WHERE子句的字段或JOIN操作的字段。
-
查看现有的索引:使用
DESCRIBE
命令查看该表的索引情况。例如,如果要为名为"employees"的表添加索引,可以使用以下查询语句:DESCRIBE employees;
这将显示表的结构,包括索引信息。
-
创建索引:使用
CREATE INDEX
命令创建索引。以下是一个示例,用于为名为"employees"表中的"last_name"字段创建索引:CREATE INDEX idx_last_name ON employees(last_name);
这将在"last_name"字段上创建一个名为"idx_last_name"的索引。
-
验证索引:可以再次使用
DESCRIBE
命令验证索引是否被成功创建。也可以执行相应的查询来验证索引是否被使用,以及是否提高了查询性能。例如,执行以下查询来查找包含特定字符串的员工:SELECT * FROM employees WHERE last_name LIKE '%Smith%';
如果查询速度有显著提升,说明索引创建成功并生效。
重要提示:索引的创建需要一定的资源和时间,因此应谨慎添加。不宜为每个字段都添加索引,否则可能导致性能下降。需要根据具体的查询需求和数据量来决定是否添加索引。另外,在添加索引之后,数据库中的数据更新或插入操作可能会变慢,因为需要维护索引的数据结构。
方式二:
要查询Oracle数据库中表的索引情况,可以使用以下SQL查询语句:
- SELECT * FROM user_indexes WHERE table_name = ‘your_table_name’;
将 “your_table_name” 替换为要查询索引的表名。这将返回与该表相关的所有索引的详细信息,包括索引名称、所属表名、索引类型、列名等。
如果你是该表的拥有者而不是当前用户,可以使用下面的语句:
- SELECT * FROM all_indexes WHERE owner = ‘your_schema_name’ AND table_name = ‘your_table_name’;
将 “your_schema_name” 替换为表所属的模式(或者简单地省略该条件以查询当前用户所拥有的表),将 “your_table_name” 替换为要查询索引的表名。
请注意,这些查询只查询与表相关的索引。如果你希望查询整个数据库中所有的索引,请使用 dba_indexes 视图,但需要具有足够的权限才能访问该视图。
2、主键ID自增
oracel 数据库新增表后,主键ID自增需要添加序列:命令如下:
CREATE SEQUENCE "APPS"."表名_SQUE" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20
3、基础语法
- 查询某个字段是否有重复数据 YOUR_FIELD 字段 YOUR_TABLE表名
SELECT YOUR_FIELD, COUNT(YOUR_FIELD) AS Duplicates
FROM YOUR_TABLE
GROUP BY YOUR_FIELD
HAVING COUNT(YOUR_FIELD) > 1;
- 修改表字段类型
alter table CUX_OM_PROJECT_SO_CONFIG add tmp_col DATE(7);-- 添加临时列
update CUX_OM_PROJECT_SO_CONFIG set tmp_col = ; --将目标字段中数据加入到临时列中
update CUX_OM_PROJECT_SO_CONFIG set END_DATE = null; --将目标字段数据清空
alter table CUX_OM_PROJECT_SO_CONFIG modify ( END_DATE NUMBER(1)); --更改目标字段类型
update CUX_OM_PROJECT_SO_CONFIG set END_DATE = tmp_col; --将临时列数据加回到目标字段中
alter table CUX_OM_PROJECT_SO_CONFIG drop column tmp_col; --清除临时列
SELECT DISTINCT END_DATE FROM CUX_OM_PROJECT_SO_CONFIG;
SELECT DISTINCT tmp_col FROM CUX_OM_PROJECT_SO_CONFIG;
- 基于A字段多条数据,获取B字段最大的一条数据
-- 查询思路:为了按照 c.PRODUCT_CODE 进行分组,并取出每个 PRODUCT_CODE 下 DETAIL_ID 取最大的那一条记录,可以使用子查询结合 ROW_NUMBER() 或 MAX() 函数。我们确保从 TECH_PROBLEM_CLOSED 表中每个 PRODUCT_CODE 获取 DETAIL_ID 最大的一条记录。以下是通过使用 ROW_NUMBER() 函数的查询示例:
SELECT
detailId,
billNo,
testField,
problemCategory,
briefDesc,
detailDesc,
productCode
FROM
(
SELECT
c.DETAIL_ID AS detailId,
c.BILL_NO AS billNo,
c.TEST_FIELD AS testField,
c.PROBLEM_CATEGORY AS problemCategory,
c.BRIEF_DESC AS briefDesc,
c.DETAIL_DESC AS detailDesc,
c.PRODUCT_CODE AS productCode,
-- 根据物料编码 PRODUCT_CODE多条情况下,取 DETAIL_ID 最大的一条数据
ROW_NUMBER ( ) OVER ( PARTITION BY c.PRODUCT_CODE ORDER BY c.DETAIL_ID DESC ) AS rn
FROM
TECH_PROBLEM_CLOSED c
WHERE
c.PRODUCT_CODE = #{itemNum}
)
WHERE
-- 只取一条数据
rn = 1;
--优化说明:
--使用 ROW_NUMBER(): 我们在 PARTITION BY c.PRODUCT_CODE 中对 PRODUCT_CODE 进行分组,并使用 ORDER BY c.DETAIL_ID DESC 确保 DETAIL_ID 最大的记录排在前面。ROW_NUMBER() 将为每个 PRODUCT_CODE 分组中的行分配一个唯一的序号。
--过滤结果: 外层查询使用 WHERE rn = 1 来选择每组中的最大 DETAIL_ID 记录。
--保留条件: SQL中包含了 WHERE 子句以过滤产品代码。
- 基于某个字段的内容前几位进行去重
SELECT
DETAIL_ID,
MASTER_ID,
ITEM_NUMBER,
ITEM_NAME,
ITEM_TYPE
FROM
(
SELECT
DETAIL_ID,
MASTER_ID,
ITEM_NUMBER,
ITEM_NAME,
ITEM_TYPE,
ROW_NUMBER() OVER (PARTITION BY SUBSTR(ITEM_NUMBER, 1, 6) ORDER BY DETAIL_ID) AS rn
FROM
"CUX_TECH_PROJECT_NEW_ITEM"
)
WHERE
rn = 1;
--优化说明:
--使用 SUBSTR 函数:在 PARTITION BY 子句中,使用 SUBSTR(ITEM_NUMBER, 1, 6) 来只考虑 ITEM_NUMBER 的前6位进行分组。这是实现您的需求的关键。
--保持原有逻辑:查询的主要逻辑保持不变。依然是通过 ROW_NUMBER() 对分组结果进行排序并筛选出每组的第一行。