2016-08-02 74 views
2

我有一个'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返回的所有父帐户及其“第一个孩子”的列表未排序?

+1

重写你的问题。提供脚本(仅适用于相关列)和一致的样本数据(向下滚动并看到'80005217'以及它仍然对我们不可见)和期望的输出,因此我们可以轻松地重新创建并测试我们的想法。 –

+0

如何在这些表上插入数据?你有没有试过通过创建测试表和测试数据来重现这一点? –

+0

预测未排序查询的结果在技术上是不可能的。即使您在每次运行查询时都能得到相同的结果 - 也无法保证下次查询尝试访问表时将首先选择相同的行(因为块可能以不同的方式读取然后命令)。如果需要能够预测行返回的顺序,请排序查询。就那么简单。 –

回答

0

为保证记录按照固定顺序进入,我们必须在ORDER BY子句中为数据库提供排序标准。如果没有定义“第一性”的属性,则不能保证。如果没有ORDER BY子句,记录基本上处于不受控制的顺序,但由于数据库内部的原因,它们通常会陷入某种模式。

那么,是什么让帐户80007325第一个孩子WHERE ACPARENT = '80005217'?显然不是数字顺序。还有其他的标准吗?创建日期?旗帜专栏?似乎你需要与你的用户交谈。他们真的关心哪些记录是第一个?所有的时间或只是在一些特定的报告?

如果用户不能确定有没有什么可以做的标准......

...虽然我可能会随时显示它由ACCTNO数字排序CHILDACCOUNT。至少可以提供一致性,用户将会习惯它。