select t.room_id, t.cust_id, (date_format(now(),'%Y-%m')- ( CASE WHEN p.ChargeMode ='-1' THEN date_add(substring(t.fees_due_date,1,10), interval 1 MONTH) WHEN ChargeMode ='0' THEN substring(t.fees_due_date,1,10) ELSE '' END as fees_due_date) a) d from tb_hspr_fees t limit(0,10000) left join projects p on p.id = t.project_id and t.debts_amount > 0 and p.deleted = '0'; left join tb_hspr_corp_cost_item c on c.id = t.corp_cost_id and substring(c.cost_code,1,4) = '0001' and p.deleted = '0';检查一下这个sql语句是否可以运行,如果不能怎么修改
时间: 2024-03-12 11:50:06 浏览: 26
这段 SQL 查询语句存在一些语法错误,以下是修改后的语句:
```
SELECT t.room_id, t.cust_id, (DATE_FORMAT(NOW(), '%Y-%m') - (CASE WHEN p.ChargeMode = '-1' THEN DATE_ADD(SUBSTRING(t.fees_due_date, 1, 10), INTERVAL 1 MONTH) WHEN p.ChargeMode = '0' THEN SUBSTRING(t.fees_due_date, 1, 10) ELSE '' END)) AS d
FROM tb_hspr_fees t
LEFT JOIN projects p ON p.id = t.project_id AND t.debts_amount > 0 AND p.deleted = '0'
LEFT JOIN tb_hspr_corp_cost_item c ON c.id = t.corp_cost_id AND SUBSTRING(c.cost_code, 1, 4) = '0001' AND p.deleted = '0'
LIMIT 0, 10000;
```
修改后的语句主要是对语法错误进行了修正,将 SELECT、FROM、LEFT JOIN 和 LIMIT 关键词的位置修改为正确的顺序,并且对 CASE WHEN 语句的语法进行了修正。同时,将 AS 关键词添加到最后一个查询项前面,以遵循 SQL 的语法规范。
相关问题
SELECT t.*, c.manage_person_mobile as phone FROM ( SELECT a.biz_date, a.county_name, a.depart_name, a.person_uuid, a.cust_code, a.cust_name, a.terminal_level_name, a.data_gather_type_name, a.sc_type_name, a.sc_score, b.sc_type_name AS sc_type_name_old, b.sc_score AS sc_score_old, a.sc_score - b.sc_score AS up FROM ads_yh_yx_sctwo a LEFT JOIN ads_yh_yx_sctwo b ON a.cust_code = b.cust_code AND b.biz_date = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 2 DAY), '%Y%m%d') AND b.person_uuid = '00000000001389361632876_5304_371' WHERE a.biz_date = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), '%Y%m%d') AND a.person_uuid = '00000000001389361632876_5304_371' AND a.sc_type_name <> b.sc_type_name AND (a.sc_score - b.sc_score) <> 0 ) t LEFT JOIN ads_yh_yx_customer_login c ON t.cust_code = c.cust_code; 优化以上代码
优化以上代码可以考虑以下几点:
1. 子查询替换为临时表:将子查询部分的代码提取出来,创建一个临时表,然后在主查询中引用该临时表,这样可以提高查询效率。
```sql
CREATE TEMPORARY TABLE temp_table AS
SELECT
a.biz_date,
a.county_name,
a.depart_name,
a.person_uuid,
a.cust_code,
a.cust_name,
a.terminal_level_name,
a.data_gather_type_name,
a.sc_type_name,
a.sc_score,
b.sc_type_name AS sc_type_name_old,
b.sc_score AS sc_score_old,
a.sc_score - b.sc_score AS up
FROM ads_yh_yx_sctwo a
LEFT JOIN ads_yh_yx_sctwo b ON a.cust_code = b.cust_code
AND b.biz_date = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 2 DAY), '%Y%m%d')
AND b.person_uuid = '00000000001389361632876_5304_371'
WHERE a.biz_date = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), '%Y%m%d')
AND a.person_uuid = '00000000001389361632876_5304_371'
AND a.sc_type_name <> b.sc_type_name
AND (a.sc_score - b.sc_score) <> 0;
```
2. 使用索引:对于频繁使用的列,可以考虑创建索引以提高查询效率。根据实际情况,在 `ads_yh_yx_sctwo` 表的 `biz_date`、`person_uuid` 和 `cust_code` 列上创建索引。
```sql
CREATE INDEX idx_biz_date ON ads_yh_yx_sctwo (biz_date);
CREATE INDEX idx_person_uuid ON ads_yh_yx_sctwo (person_uuid);
CREATE INDEX idx_cust_code ON ads_yh_yx_sctwo (cust_code);
```
3. 优化 JOIN 条件:根据实际情况,可以考虑调整 JOIN 的条件,使其更加精确,减少不必要的匹配。
4. 使用 EXPLAIN 分析查询计划:使用 `EXPLAIN` 命令可以帮助分析查询计划,找出潜在的性能问题,并进行相应优化。
以上是一些常见的优化方法,具体的优化策略需要根据实际情况和数据库结构进行调整。
编写存储过程 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_202301 a LEFT JOIN JOUR1.om_order_202301 b ON a.order_id = b.order_id LEFT JOIN params1.sec_developer c ON b.dev_id = c.dev_id UNION ALL 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_202302 a LEFT JOIN JOUR1.om_order_202302 b ON a.order_id = b.order_id LEFT JOIN params1.sec_developer c ON b.dev_id = c.dev_id UNION ALL 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_202303 a LEFT JOIN JOUR1.om_order_202303 b ON a.order_id = b.order_id LEFT JOIN params1.sec_developer c ON b.dev_id = c.dev_id UNION ALL 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_202304 a LEFT JOIN JOUR1.om_order_202304 b ON a.order_id = b.order_id LEFT JOIN params1.sec_developer c ON b.dev_id = c.dev_id
你可以编写一个存储过程来执行这个查询。下面是一个示例:
```sql
CREATE OR REPLACE PROCEDURE get_data AS
BEGIN
-- 创建临时表来保存结果
CREATE GLOBAL TEMPORARY TABLE temp_data (
order_id NUMBER,
done_date DATE,
cust_id NUMBER,
subscriber_ins_id NUMBER,
access_num VARCHAR2(100),
dev_id NUMBER,
dev_name VARCHAR2(100),
corp_org VARCHAR2(100),
company_name VARCHAR2(100),
department_code VARCHAR2(100),
department_name VARCHAR2(100),
remarks VARCHAR2(100)
) ON COMMIT PRESERVE ROWS;
-- 第一个查询
INSERT INTO temp_data
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_202301 a
LEFT JOIN JOUR1.om_order_202301 b
ON a.order_id = b.order_id
LEFT JOIN params1.sec_developer c
ON b.dev_id = c.dev_id;
-- 后续查询使用UNION ALL连接
INSERT INTO temp_data
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_202302 a
LEFT JOIN JOUR1.om_order_202302 b
ON a.order_id = b.order_id
LEFT JOIN params1.sec_developer c
ON b.dev_id = c.dev_id;
INSERT INTO temp_data
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_202303 a
LEFT JOIN JOUR1.om_order_202303 b
ON a.order_id = b.order_id
LEFT JOIN params1.sec_developer c
ON b.dev_id = c.dev_id;
INSERT INTO temp_data
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_202304 a
LEFT JOIN JOUR1.om_order_202304 b
ON a.order_id = b.order_id
LEFT JOIN params1.sec_developer c
ON b.dev_id = c.dev_id;
-- 查询结果
SELECT * FROM temp_data;
-- 删除临时表
DROP TABLE temp_data;
END;
/
```
这个存储过程创建了一个临时表 `temp_data` 来保存查询结果,并将每个查询的结果插入到临时表中。最后,通过查询 `temp_data` 表来获取结果。
请注意,根据你的实际需求和数据库结构,你可能需要修改表和列的定义,以及查询的逻辑。确保在执行存储过程之前,已经创建了所需的表和索引。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)