使用ROW_NUMBER()查询:列名 'RowNumber' 无效。(转载)

本文探讨了在 SQL 查询中使用 ROW_NUMBER() 函数时遇到的常见错误,并提供了一种解决方法。通过包裹额外的子查询,可以避免直接在查询结果集中使用刚定义的 RowNumber 列名所导致的问题。

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

原文地址:https://my.oschina.net/wangzan/blog/202456

使用ROW_NUMBER()方法查询结果集;语句如下:

 
select ROW_NUMBER() OVER(ORDER BY dbo.OrderOutProduct.ID) AS RowNumber,
 dbo.Order.ID,Telephone,AddressCity,Province, from dbo.Order 
inner join dbo.Order2
on dbo.Order.ID=Order2ID
inner join dbo.Order3
on dbo.Order2.OrderID=dbo.Order3.Order3
where Service=1 and RowNumber=1

但是出现了错误:列名 'RowNumber' 无效。

image

查到网上给的解释是:在sql里这个叫做,热名称,刚定的不能立马使用!要包一层查询!

修改为:

select * from(
select ROW_NUMBER() OVER(ORDER BY dbo.OrderOutProduct.ID) AS RowNumber,
dbo.Order.ID,Telephone,AddressCity,Province, from dbo.Order 
inner join dbo.Order2
on dbo.Order.ID=Order2ID
inner join dbo.Order3
on dbo.Order2.OrderID=dbo.Order3.Order3
where Service=1 
)U where RowNumber=1


COLUMN_MAPPING = { "报警名称": "alarm_name", "互锁类型": "lock_type", "所属模块": "module_name", "模块类型": "module_type", "所属产品": "product", "触发器": "trigger", "渠道号": "channel_number", "触发器渠道": "trigger_way", "报警描述": "alarm_des", "报警级别": "alarm_level", "报警动作": "alarm_action", "报警动作Data通道": "alarm_channel", "报警动作描述": "alarm_action_desc", "满足条件": "condition", "备注": "desc" } #REQUIRED_COLUMNS = ["报警名称", "互锁类型", "所属模块", "模块类型", "所属产品"] @router.post(path='/ledgers/upload', description='互锁台账上传') async def _(files: List[UploadFile] = File(...)): # 获取当前用户ID user_id = CTX_USER_ID.get() log_user_id = user_id if user_id else 0 # 初始化结果集 results = [] total_records = 0 success_files = 0 print('互锁台账上传逻辑') for file in files: print(file.filename) file_result = { "filename": file.filename, "status": "pending", "records": 0, "errors": [] } try: # 1. 验证文件类型 if not file.filename.lower().endswith(('.xlsx', '.xls')): raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="仅支持.xlsx和.xls格式的Excel文件" ) # 2. 读取Excel文件 contents = await file.read() df = pd.read_excel(contents) # 3. 验证列名是否匹配 missing_columns = [cn for cn in COLUMN_MAPPING.keys() if cn not in df.columns] if missing_columns: file_result["errors"].append(f"缺少必要列: {', '.join(missing_columns)}") file_result["status"] = "failed" results.append(file_result) continue # 4. 重命名列(中文→英文) df.rename(columns=COLUMN_MAPPING, inplace=True) # 5. 处理空值 df.replace({np.nan: None}, inplace=True) # 6. 数据验证和转换 valid_records = [] # 存储(行索引, 记录)的列表 for index, row in df.iterrows(): try: record = InterLockLedgerCreate(**row.to_dict()) valid_records.append((index, record)) # 记录行索引和记录 except ValidationError as e: error_msg = f"第{index + 2}行数据错误: {str(e)}" file_result["errors"].append(error_msg) # 7. 如果有验证错误,提前终止 # 8. 批量保存到数据库 saved_count = 0 for index, record in valid_records: try: await interlockledger_controller.create(obj_in=record) saved_count += 1 except Exception as e: # 捕获所有保存时的异常 error_msg = f"第{index + 2}行数据保存失败: {str(e)}" file_result["errors"].append(error_msg) # 9. 更新该文件的上传结果 file_result["records"] = saved_count if file_result["errors"]: if saved_count > 0: file_result["status"] = "partial" else: file_result["status"] = "failed" else: file_result["status"] = "success" results.append(file_result) total_records += saved_count if saved_count > 0: success_files += 1 # 记录日志(每个文件处理完后记录?但原代码是在循环内记录,这里我们保持原样,即每个文件处理完记录一次) await insert_log( log_type=LogType.UserLog, log_detail_type=LogDetailType.InterLockLedgerUpload, by_user_id=log_user_id, ) except HTTPException as e: file_result["status"] = "failed" file_result["errors"].append(str(e.detail)) results.append(file_result) except Exception as e: file_result["status"] = "failed" file_result["errors"].append(f"系统错误: {str(e)}") results.append(file_result) # 构建最终响应 response_data = { "total_files": len(files), "success_files": success_files, "total_records": total_records, "details": results } return Success(msg="Upload Successfully", data={}) 相应的接口如何修改
07-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值