NOT EXIST和NOT IN 和MINUS的用法

本文探讨了在SQL查询中使用NOTIN和MINUS操作符优化查询性能的方法,通过实例展示了如何避免使用NOT EXISTS,进而提高查询速度。重点介绍了在特定场景下,利用这些操作符可以显著减少查询时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

①NOT EXISTS一般都会比较慢

UPDATE  A
SET DATE=sysdate
WHERE LINK_TAISHOGAI_FG = '0'
    AND NOT EXISTS
(SELECT 1
 FROM   FROM   B
 WHERE  A.ID1= B.ID1
 AND    A.ID2 = B.ID2
 AND   A.ID3 = B.ID3 
AND    B.ID4 IN ('A','B','C')
)

 

②上面的改为NOT IN

UPDATE  A
SET DATE=sysdate
WHERE LINK_TAISHOGAI_FG = '0'
AND (A.ID1,A.ID2,A.ID3) NOT IN
(SELECT  B.ID1,B.ID2,B.ID3 
 FROM   B
 WHERE  A.ID1= B.ID1
 AND    A.ID2 = B.ID2
 AND   A.ID3 = B.ID3 
AND    B.ID4 IN ('A','B','C')
)

③加入MINUS,能缩短时间

 

A表的数据如果在BC表里不存在的话将其其中一个字段更新

UPDATE  A
SET DATE=sysdate
WHERE LINK_TAISHOGAI_FG = '0'
AND (A.ID1,A.ID2,A.ID3) IN
(
select A.ID1,A.ID2,A.ID3 FROM A
where LINK_TAISHOGAI_FG = '0'
MINUS
select temp.ID1,temp.ID2,temp.ID3 
FROM
 (
  select B.ID1,B.ID2,B.ID3
  FROM B
  where    B.ID4 IN ('A','B','C')
  UNION ALL
  select C.ID1,C.ID2,C.ID3
  FROM C
  where    C.ID4 IN ('AA','BB','CC')
 )
)

import pandas as pd import numpy as np import os import matplotlib.pyplot as plt from tqdm import tqdm from concurrent.futures import ProcessPoolExecutor # ========== 配置参数 ========== D_TYPE = {0: np.float32, 1: np.float32} CHUNK_SIZE = 10000 # ========== 数据处理函数 ========== def process_sheet(df: pd.DataFrame, target: float) -> float: """处理单个工作表的核心逻辑""" valid_mask = df.iloc[:, [0,1]].notna().all(axis=1) a_col = df.iloc[valid_mask, 0].astype(np.float32) b_col = df.iloc[valid_mask, 1].astype(np.float32) mask = a_col.between( target - 0.003, target + 0.003, inclusive='both' ) return b_col[mask].sum() def process_excel(file_path: str, target: float) -> float: """处理单个Excel文件的并行单元""" try: all_sheets = pd.read_excel( file_path, sheet_name=None, skiprows=5, usecols="A:B", header=None, dtype=D_TYPE, engine='openpyxl' ) total = sum( process_sheet(df, target) for df in all_sheets.values() ) return total / len(all_sheets) except Exception as e: print(f"处理文件 {os.path.basename(file_path)} 时出错: {str(e)}") return 0.0 # ========== 主处理流程 ========== if __name__ == "__main__": # 初始化中文字体配置(核心修复) plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'KaiTi'] # 多字体备选 plt.rcParams['axes.unicode_minus'] = False # 用户输入 target_value = float(input("请输入要筛选的A列目标值:")) input_dir = input("请输入Excel文件所在的文件夹路径:").strip() output_dir = input("请输入结果图表输出路径:").strip() os.makedirs(output_dir, exist_ok=True) # 获取文件列表 files = [ os.path.join(input_dir, f) for f in os.listdir(input_dir) if f.endswith(".xlsx") ] # 并行处理 with ProcessPoolExecutor() as executor: futures = { executor.submit(process_excel, file, target_value): os.path.basename(file) for file in files } results = [] with tqdm(total=len(files), desc="处理进度") as pbar: for future in futures: filename = futures[future] try: avg_sum = future.result() results.append((filename, avg_sum)) except Exception as e: print(f"文件 {filename} 处理异常: {str(e)}") finally: pbar.update(1) # ========== 可视化优化 ========== plt.style.use('seaborn-v0_8-darkgrid') plt.figure(figsize=(12, 6), dpi=100) plt.barh( [x[0] for x in results], [x[1] for x in results], color='#4C72B0' ) plt.xlabel("B列总平均值", fontsize=12, fontweight='bold') plt.ylabel("文件名", fontsize=12, fontweight='bold') plt.title(f"目标值 {target_value}±0.003 数据统计\n({len(files)}个文件)", fontsize=14, pad=20) plt.grid(axis='x', linestyle='--', alpha=0.7) # 调整布局保存 plt.tight_layout() output_path = os.path.join(output_dir, "optimized_result.png") plt.savefig(output_path, dpi=300, bbox_inches='tight') print(f"\n处理完成!优化结果图表已保存至:{output_path}") 这段代码的文字路径在哪修改
最新发布
03-19
<think>好的,用户问的是如何修改这段代码中的文字路径。首先我需要仔细看一下用户提供的代码,确定他们所说的“文字路径”具体指的是什么。 用户提供的代码主要处理Excel文件,然后生成图表。代码中有几个路径相关的部分:输入目录`input_dir`、输出目录`output_dir`,以及最终保存图表的路径`output_path`。用户的问题是关于修改这些路径的位置,可能是指如何更改输入或输出文件夹的位置,或者调整生成图表保存的位置。 接下来,我需要检查代码中涉及路径的部分。在代码的主处理流程部分,用户通过输入获取了`input_dir``output_dir`,然后使用`os.makedirs`创建输出目录。最后的图表保存路径是`os.path.join(output_dir, "optimized_result.png")`,所以图表会被保存在用户指定的输出目录下,文件名是固定的“optimized_result.png”。 用户可能希望修改的是输入或输出路径的设置方式,比如从硬编码改为配置文件,或者调整输入输出的逻辑。根据用户的提问,“文字路径”可能是指代码中直接写死的路径部分,但在这段代码中,路径都是通过用户输入动态获取的,没有硬编码的部分。不过,可能用户指的是输出文件的名称或路径的生成方式,比如修改保存的文件名或者路径结构。 另外,用户可能误解了“文字路径”这个术语,实际上在代码中没有“文字路径”这个专业术语,所以需要根据上下文推测他们的需求。可能的疑问点包括:如何更改输入文件夹的默认位置?如何修改输出图表的保存路径或文件名?或者如何调整文件处理的路径逻辑,比如处理子文件夹中的文件等。 需要进一步分析代码中路径处理的部分。输入目录是通过用户输入获取的,代码使用`os.listdir(input_dir)`来遍历Excel文件,所以如果用户想修改输入路径,只需要在运行程序时输入正确的文件夹路径即可。输出目录同样由用户输入指定,程序会自动创建该目录。 图表保存的路径是`output_dir`加上固定的文件名,用户如果想修改图表保存的位置或名称,可以调整`output_path`的生成方式。例如,将文件名改为动态的,包含目标值或日期时间戳,或者将图表保存到不同的子目录中。 可能的用户需求场景:用户希望将输出图表保存到特定的位置,而不是每次手动输入路径;或者希望自动组织输出文件到不同的文件夹中;或者希望修改文件名的生成规则,使其包含更多信息,比如目标值或处理日期。 因此,回答应该集中在如何修改代码中的路径设置,包括输入目录、输出目录以及图表保存路径的生成逻辑。需要指出代码中哪些部分控制路径,并提供修改这些部分的示例,比如硬编码路径、动态生成路径、使用配置文件等不同方法。 同时,需要确保用户了解代码中路径处理的具体行号或位置,方便他们快速找到需要修改的地方。例如,在代码中,`input_dir``output_dir`是通过用户输入获取的,而`output_path`是组合输出目录固定文件名生成的。 最后,需要提醒用户注意路径的正确性,比如使用绝对路径还是相对路径,路径中的斜杠方向,以及确保程序有权限访问这些路径等常见问题。</think>以下是代码中涉及文件路径的关键位置及修改方法详解: --- ### 一、路径修改核心位置 #### 1. **输入路径**(第37-38行) ```python input_dir = input("请输入Excel文件所在的文件夹路径:").strip() # 修改此处输入提示语或获取方式 output_dir = input("请输入结果图表输出路径:").strip() # 修改输出路径获取逻辑 ``` #### 2. **文件遍历逻辑**(第42-45行) ```python files = [ os.path.join(input_dir, f) for f in os.listdir(input_dir) # 此处控制输入目录的扫描方式 if f.endswith(".xlsx") # 此处控制文件扩展名过滤 ] ``` #### 3. **结果保存路径**(第78行) ```python output_path = os.path.join(output_dir, "optimized_result.png") # 修改输出文件名路径 ``` --- ### 二、典型修改方案 #### 方案1:硬编码固定路径(适合自动化脚本) ```python # 修改输入输出路径为固定值 input_dir = r"D:\data\excel_files" # 使用原始字符串避免转义问题 output_dir = r"E:\reports\2024_Q3" # 确保目录已存在或添加os.makedirs() os.makedirs(output_dir, exist_ok=True) # 自动创建目录 ``` #### 方案2:动态路径生成(推荐) ```python # 根据日期自动生成输出路径 from datetime import datetime date_str = datetime.now().strftime("%Y%m%d") output_dir = os.path.join(r"E:\reports", f"report_{date_str}") ``` #### 方案3:配置文件读取(适合复杂项目) ```python # 创建 config.ini 文件 import configparser config = configparser.ConfigParser() config.read('config.ini') input_dir = config['PATHS']['input_dir'] output_dir = config['PATH']['output_dir'] ``` --- ### 三、路径优化建议 1. **跨平台兼容**: ```python # 使用os.path.join自动处理路径分隔符 input_dir = os.path.join("data", "raw_files") # 输出: data/raw_files 或 data\raw_files ``` 2. **递归搜索文件**(处理子目录): ```python # 使用os.walk遍历子文件夹 files = [] for root, _, filenames in os.walk(input_dir): for f in filenames: if f.endswith(".xlsx"): files.append(os.path.join(root, f)) ``` 3. **文件名动态化**: ```python # 在输出文件名中包含目标值 output_name = f"result_{target_value:.3f}.png" output_path = os.path.join(output_dir, output_name) ``` --- ### 四、路径验证技巧 ```python # 添加路径有效性检查 if not os.path.isdir(input_dir): raise ValueError(f"输入路径 {input_dir} 不存在或不可访问") if not os.access(output_dir, os.W_OK): raise PermissionError(f"无权限写入输出目录 {output_dir}") ``` --- ### 五、完整路径修改示例 ```python # ========== 主处理流程 ========== if __name__ == "__main__": # 修改为固定路径 + 动态文件名 input_dir = r"C:\企业数据\生产报表" # 硬编码输入路径 output_dir = os.path.join(os.path.expanduser("~"), "Desktop") # 输出到桌面 # 生成带时间戳的文件名 timestamp = datetime.now().strftime("%Y%m%d_%H%M") output_path = os.path.join(output_dir, f"analysis_result_{timestamp}.png") ``` 通过调整上述代码段中的路径相关变量,即可实现不同级别的路径控制需求。建议优先使用动态路径生成方案以提高代码灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值