Oracle函数中查询的字段值和直接sql查询的值不一致

从这篇博客取到的灵感oracle存储过程中查询到的结果和一般查询的结果不一样_oracle 存储sql查询结果与sql窗口查询结果不同-优快云博客y

起因是要去写一个函数计算零售价,结果一直得不到正确的零售价

SELECT t.content
          FROM b_retail t
         WHERE t.b_retaildissku_id = b_retaildissku_id
           AND t.m_product_id = p_product_id
           AND rownum = 1;

但是拿出来填上p_product_id、b_retaildissku_id的值后,查出来的是正确的值

count()了一下上面代码中的t.content后发现 t.b_retaildissku_id = b_retaildissku_id这个条件是失效的,gpt给出的意见是有会话,或者锁住了,实际上没有会话也没有被锁,最终搜索到了这个:

字段名和参数一致时 系统默认 t.b_retaildissku_id = t.b_retaildissku_id

即 自己 = 自己 ,导致失效,至此,解决。

Oracle数据库中使用 `LEFT JOIN` 查询时,若发现 `SELECT` 结果字段与表中实际一致,通常涉及以下几个原因及解决方法: ### 1. **连接条件准确** - 如果 `LEFT JOIN` 的 `ON` 条件设置准确,可能导致右侧表的字段匹配到多个记录,从而引发重复或错误的。 - 例如,当右侧表中存在多个满足连接条件的记录时,左侧表的记录将被重复显示,而右侧字段可能为多个中的任意一个,这会导致查询结果一致。 - 解决方法是确保连接条件唯一且准确,例如使用主键或唯一索引字段进行连接。 ### 2. **字段别名冲突** - 在 `SELECT` 子句中,若两个表存在相同名称的字段,并且未使用表别名明确指定字段来源,可能导致字段被覆盖或混淆。 - 例如,若 `test_user` `test_team` 表中均有 `name` 字段,且在 `SELECT` 中未使用 `test_user.name AS user_name` `test_team.name AS team_name` 进行区分,可能导致字段显示错误。 - 解决方法是使用表别名明确指定字段来源,并为字段设置别名以避免冲突。 ### 3. **NULL处理当** - 在 `LEFT JOIN` 中,右侧表满足连接条件的字段会显示为 `NULL`。如果在 `SELECT` 子句中未正确处理 `NULL` ,可能导致字段显示为空或默认。 - 例如,若直接使用 `SELECT test_team.name` 而未处理 `NULL` ,可能导致字段显示为空字符串或默认。 - 解决方法是使用 `NVL` 或 `COALESCE` 函数处理 `NULL` ,例如 `SELECT NVL(test_team.name, '默认')`。 ### 4. **聚合函数误用** - 若在 `SELECT` 子句中使用了聚合函数(如 `SUM`, `COUNT` 等)但未正确分组或过滤数据,可能导致字段计算错误。 - 例如,若使用 `SUM(test_team.value)` 但未按 `test_user.id` 分组,可能导致字段被错误地汇总。 - 解决方法是确保使用 `GROUP BY` 子句进行正确分组,并验证聚合函数的逻辑是否正确。 ### 5. **子查询影响结果** - 若 `LEFT JOIN` 的右侧表是一个子查询,且子查询的逻辑准确,可能导致连接结果一致。 - 例如,若子查询未正确筛选数据或未使用 `DISTINCT` 去重,可能导致连接结果重复或错误。 - 解决方法是验证子查询的逻辑是否正确,并确保子查询结果集的准确性。 ### 示例代码 以下是一个使用 `LEFT JOIN` 的示例,展示了如何避免字段一致的问题: ```sql SELECT test_user.id AS user_id, test_user.name AS user_name, NVL(test_team.name, '未分配') AS team_name FROM test_user LEFT JOIN test_team ON test_user.team_id = test_team.id; ``` 在上述示例中: - 使用了表别名 `test_user` `test_team` 来明确字段来源。 - 使用了 `NVL` 函数处理 `NULL` ,确保当 `test_team.name` 为 `NULL` 时显示为 `'未分配'`。 - 使用了明确的连接条件 `test_user.team_id = test_team.id` 来确保连接准确性。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值