执行连接时出现意外结果

时间:2014-07-07 12:02:07

标签: sql oracle join

我的查询或多或少如下:

select node from NODES node 
inner join SIGNATURES signature on node.NODE_ID=signature.NODE_ID and (... some non-important, AND separated restrictions on signature fields) 
left outer join OTHERS other on signature.ID=other.SIGNATURE_ID 
where node.DISABLED=0 and (some non-important, AND separated restrictions on node fields);

NODES与SIGNATURES的关系为1..n,而SIGNATURES与其他人的关系为1..n

问题是,我在一些奇怪的情况下被告知尚未识别的极端情况,此查询在生产中返回包含将DISABLED字段设置为1的节点的结果。这怎么可能?

2 个答案:

答案 0 :(得分:2)

您没有显示完整的查询。 WHERE子句可能包含AND和OR的混合,您只是忘记了合适的括号。

示例:where node.DISABLED=0 AND blabla OR thisnthat AND somestuff

答案 1 :(得分:1)

可能发生的一种方法是脏读。在生产环境中,有人可以在您的查询选择记录后更改记录的DISABLED值。此行为通过隔离级别进行控制,以便快速查看

http://msdn.microsoft.com/en-us/vstudio/ms709374%28v=vs.103%29.aspx

或许多博主的许多出色的解释。

隔离级别通常在数据库级别设置,但至少在T-SQL中,您可以使用提示在查询中请求它。请参阅READCOMMITTED,REPEATABLEREAD等 http://msdn.microsoft.com/en-us/library/ms187373.aspx

您可能希望在帖子中添加隔离级别,这有助于进一步完善答案。