Oracle sql语句 select roltno from table1 where (roltno like '1%' or roltno like '3%') 优化
时间: 2023-12-20 08:08:01 浏览: 64
针对这个查询语句,可以做一些优化:
1. 索引优化:为 roltno 字段建立索引,可以加快查询速度。
2. 增加条件:如果 roltno 的数据分布比较均匀,可以根据实际情况增加一些条件,例如:
```
WHERE (roltno LIKE '1%' AND SUBSTR(roltno, 2, 1) BETWEEN '0' AND '9')
OR (roltno LIKE '3%' AND SUBSTR(roltno, 2, 1) BETWEEN '0' AND '9')
```
这样可以排除掉 roltno 开头是 1 或 3 但第二个字符不是数字的情况,避免了一些无用的匹配。
3. 分割查询:如果数据量比较大,可以考虑将查询分割成多个小查询,例如:
```
WHERE roltno LIKE '1%'
UNION ALL
WHERE roltno LIKE '3%'
```
这样可以减少单个查询的数据量,提高查询效率。
相关问题
select * from ALL_tables where table_name like vna_down_studylist3 检查语句错误
这个SQL检查语句的目的是从所有的表(`ALL_tables`)中选择所有列(`*`),条件是表名包含字符串"vna_down_studylist3"。然而,存在几个潜在的问题:
1. **`ALL_tables`**:数据库系统通常没有名为`ALL_tables`的表来获取所有表的信息。大部分时候,你需要查询特定的数据字典视图(如Oracle的`ALL_TABS`、MySQL的`INFORMATION_SCHEMA.TABLES`等)。
2. **动态查询**: 如果`table_name`是从用户输入或其他不可信来源得到的,并尝试用于这样的查询,可能存在SQL注入风险,因为`like`操作可以被滥用。
3. **大小写敏感性**: 不清楚这里是区分大小写的还是不区分的,这取决于具体的数据库设置。如果大小写敏感,那么只有精确匹配才会返回结果。
正确的修改可能会是:
```sql
SELECT * FROM information_schema.tables
WHERE table_name LIKE 'vna_down_studylist3%' -- 添加了百分号表示包含模式,可能需要调整大小写规则
AND table_schema = 'your_database'; -- 如果不是当前数据库,记得添加合适的schema名称
```
没有数据生成插入 CREATE OR REPLACE PROCEDURE ord_dev_3 IS v_month NUMBER; v_sql VARCHAR2(4000); CURSOR v_dt IS SELECT DISTINCT dd FROM ycyd.tables_ord ORDER BY dd; BEGIN DELETE FROM tables_ord; INSERT INTO tables_ord SELECT dd FROM (SELECT MAX(to_number(SUBSTR(TABLE_NAME, '15'))) dd FROM SYS.ALL_TABLES a WHERE a.owner = upper('jour1') AND a.table_name LIKE upper('om_subscriber_202___')) aa WHERE aa.dd > 202205; COMMIT; /* v_sql := 'truncate table ycyd.ord_dev_3056'; EXECUTE IMMEDIATE v_sql; COMMIT;*/ FOR v_month IN 202206 .. 202312 LOOP v_sql := 'truncate table ycyd.ord_dev_3056'; EXECUTE IMMEDIATE v_sql; v_sql := 'insert into ycyd.ord_dev_3056 SELECT a.order_id, a.done_date, a.cust_id, a.subscriber_ins_id, a.access_num, c.dev_id, c.dev_name, c.corp_org, c.company_name, c.department_code, c.department_name, c.remarks FROM JOUR1.Om_Subscriber_' || v_month || ' a LEFT JOIN JOUR1.om_order_' || v_month || ' b ON a.order_id = b.order_id LEFT JOIN params1.sec_developer c ON b.dev_id = c.dev_id WHERE 1 = 1 AND a.access_num LIKE ''192%'' AND a.action = 0'; /*EXECUTE IMMEDIATE v_sql;*/ END LOOP; EXECUTE IMMEDIATE v_sql; COMMIT; END ord_dev_3;
这段代码是一个 Oracle 存储过程,它的目的是根据一些条件生成插入数据的 SQL 语句。下面我会对这段代码进行解释:
- 首先,通过声明存储过程 `ord_dev_3`,定义了一些变量和游标。
- 游标 `v_dt` 从表 `ycyd.tables_ord` 中选择所有不重复的 `dd` 列,并按照 `dd` 进行排序。
- 接着,执行 `DELETE FROM tables_ord;` 语句,清空表 `tables_ord` 中的数据。
- 然后,执行 `INSERT INTO tables_ord SELECT dd ...` 语句,将符合条件的数据插入到表 `tables_ord` 中。具体的条件是从 `SYS.ALL_TABLES` 视图中获取最大的数字,并根据一些条件进行筛选。
- 在注释部分,有一段被注释掉的代码 `/* v_sql := 'truncate table ycyd.ord_dev_3056'; ... */`,它是对表 `ycyd.ord_dev_3056` 进行截断操作的语句,你可以根据需要解除注释并执行该操作。
- 紧接着是一个循环,从 202206 到 202312 的范围内,依次取值给变量 `v_month`。
- 在循环体内,根据当前的 `v_month` 值拼接动态 SQL 语句到变量 `v_sql` 中。
- 最后,执行 `EXECUTE IMMEDIATE v_sql;` 语句,执行动态 SQL 语句。
请注意,这段代码中有一些被注释掉的语句,你可以根据需求解除注释并执行相应的操作。另外,代码中还有一些表名和列名需要根据实际情况进行替换。执行这段代码前,请确保你已经了解代码的逻辑,并对其中的 SQL 语句进行适当的修改和调整。
阅读全文