我有一个'ACCOUNTS'表,其中有ACCTNO和ACPARENT字段。一个帐户可以是另一个帐户的父母。一个帐户可以有很多孩子。返回Oracle中的第一个'未排序'连接SQL
已经发现某些外部过程在某些报告和输出中正在使用“第一个孩子” - 但没有任何特定孩子成为“第一”的真正“原因”,只是代码中的一个无意的错误。
解开这个问题的第一步 - 我需要一个可以重新运行的查询(但不是经常的,所以优化并不是真正的因素),对于所有父母的账号,他们的第一个孩子'是。
问题 - '第一个孩子'不一定与记录ID有关。如果我运行下面的查询,例如:
SELECT ACCTNO FROM ACCOUNTS WHERE ACPARENT = '80005217';
我得到的结果是:
ACCTNO
______
80007325
80007310
80007315
80007298
我绝对,100%确认为这个特殊的例子,账户80007325的账户ID为用作'第一个孩子'。
在另一面,如果我跑的天真查询:
SELECT A1.ACCTNO, A2.ACCTNO AS CHILDACCOUNT FROM ACCOUNTS A1
INNER JOIN ACCOUNTS A2 ON A1.ACCTNO = A2.ACPARENT
WHERE A1.ACCTNO IN
(SELECT ACPARENT FROM ACCOUNTS);
那么如果我向下滚动到80005217是父帐户,我看到下面的列表:
CHILDACCOUNT
______
80007298
80007310
80007315
80007325
这是排序,即使它不是我想要的。
是否有一个查询会让我看到我想要的单个查询的列表?由SQL返回的所有父帐户及其“第一个孩子”的列表未排序?
重写你的问题。提供脚本(仅适用于相关列)和一致的样本数据(向下滚动并看到'80005217'以及它仍然对我们不可见)和期望的输出,因此我们可以轻松地重新创建并测试我们的想法。 –
如何在这些表上插入数据?你有没有试过通过创建测试表和测试数据来重现这一点? –
预测未排序查询的结果在技术上是不可能的。即使您在每次运行查询时都能得到相同的结果 - 也无法保证下次查询尝试访问表时将首先选择相同的行(因为块可能以不同的方式读取然后命令)。如果需要能够预测行返回的顺序,请排序查询。就那么简单。 –