最后两个连接会导致重复的行

DEw*_*wok 3 sql sql-server join

好的,所以我的查询返回的行数多于重复数据的预期行数.这是我的查询:

SELECT AP.RECEIPTNUMBER
,AP.FOLDERRSN
,ABS(AP.PAYMENTAMOUNT)
,ABS(AP.PAYMENTAMOUNT - AP.AMOUNTAPPLIED)
,TO_CHAR(AP.PAYMENTDATE,'MM/DD/YYYY')
,F.REFERENCEFILE
,F.FOLDERTYPE
,VS.SUBDESC
,P.NAMEFIRST||' '||P.NAMELAST
,P.ORGANIZATIONNAME
,VAF.FEEDESC
,VAF.GLACCOUNTNUMBER

FROM ACCOUNTPAYMENT AP

INNER JOIN FOLDER F ON AP.FOLDERRSN = F.FOLDERRSN
INNER JOIN VALIDSUB VS ON F.SUBCODE = VS.SUBCODE
INNER JOIN FOLDERPEOPLE FP ON FP.FOLDERRSN = F.FOLDERRSN
INNER JOIN PEOPLE P ON FP.PEOPLERSN = P.PEOPLERSN
INNER JOIN ACCOUNTBILLFEE ABF ON F.FOLDERRSN = ABF.FOLDERRSN
INNER JOIN VALIDACCOUNTFEE VAF ON ABF.FEECODE = VAF.FEECODE

WHERE AP.NSFFLAG = 'Y'
AND F.FOLDERTYPE IN ('405B','405O')
Run Code Online (Sandbox Code Playgroud)

一切正常,直到我添加底部的两个内连接.我基本上都试图获得所有支付NSF的款项.当我运行简单查询时:

SELECT *
FROM ACCOUNTPAYMENT
WHERE NSFFLAG = 'Y'
Run Code Online (Sandbox Code Playgroud)

我只获得了与405B和405O文件夹相关的3行.所以我只期望在上面的查询中返回3行,但我得到9行,在某些列中重复信息.我需要根据有效帐户费用和帐户帐单费用表中的费用代码确切的feedesc和gl帐号.

我无法发布我的输出图片.

注意:当我运行没有两个底部连接的查询时,我得到了预期的输出.

有人可以帮我提高查询效率吗?谢谢!

根据要求,以下是我的查询返回vaf.feedesc和vaf.glaccountnumber列的结果:

Boiler Operator License Fee                                         2423809
Boiler Certificate of Operation without Manway - Revolving          2423813
Installers (Boiler License)/API Exam                            2423807
Boiler Public Inspection/Certification (State or Insurance)         2423816
Boiler Certificate of Operation with Manway                         2423801
Boiler Certificate of Operation without Manway                  2423801
Boiler Certificate of Operation with Manway - Revolving         2423813
BPV Owner/User Program Fee                                          2423801
Installers (Boiler License)/API Exam Renewal                    2423807
Run Code Online (Sandbox Code Playgroud)

Seb*_*anH 10

原因是连接的至少一个ACCOUNTBILLFEE-FOLDERVALIDACCOUNTFEE-ACCOUNTBILLFEE不是一对一的.它允许一个文件夹中有许多AccountBillFees或一个ValidAccountFee有许多AccountBillFees.

为了找到这个问题的原因,这就是我通常做的事情:

  • SELECT A, B, C将查询的部分更改为SELECT *.
  • 将结果减少到导致您遇到麻烦的行之一(通过添加WHERE ...).这是没有最后两个连接的单行和添加这两个连接后的几行.
  • 从左到右查看结果表.第一列可能会显示所有行的相同值.一旦看到列中值之间的差异,您就会知道当前正在查看的列表导致了"多行问题".
  • 现在创建一个SELECT *语句,该语句仅包含连接在一起的两个表,这两个表导致多行与WHERE ...上面使用的相同.
  • 结果应该让您清楚地了解原因.
  • 一旦你知道问题的原因,你就可以想到一个解决方案;)