Sql Inner 连接没有给出想要的结果

Posted

技术标签:

【中文标题】Sql Inner 连接没有给出想要的结果【英文标题】:Sql Inner joins not giving desired results 【发布时间】:2015-03-13 10:29:43 【问题描述】:

我想加入三个表。当我加入两个表时,查询工作正常 TBLBPVMASTER AND TBLBPVDETAILS 基于 bpvid 但是当我将 TableCheque 列表与这两个表结合起来时,我得到了结果,但并不如预期。

例如,TBLBPVMaster 包含针对 BPVID 的一条记录,TBLBPVDETAILS 包含针对 BPVID 的两条记录,chequelist 包含针对 BPVCODE 的两条记录。现在我想组合这三个表,以便生成的查询应该产生两行。以下查询产生 4 行:

SELECT TBLBPVMaster.*,TBLBPVDetails.*,TBLChequeList.*
FROM   TBLBPVDetails 
       INNER JOIN TBLBPVMaster 
       ON TBLBPVDetails.BPVId = TBLBPVMaster.BPVId 
       INNER JOIN TBLChequeList 
       ON TBLBPVMaster.BPVCode = TBLChequeList.BankVoucherCode
WHERE  TBLBPVMaster.BPVId=57

输出:

    BPVId   DateOfPayment   SubSubsidaryAccountId   Description BPVCode TotalAmount BPVId   SubSubsidaryAccountId   Amount  Description BankVoucherCode ChequeNo    ChequeDate  PaidTo  ChequeAmount
    57      2015-03-12       1-101-1001-10001       KJSKLDJDSKL  BPV-57   2000       57     1-101-1002-10002        1000     lskdsj     BPV-57            1887      2015-03-10  kdfjhdfj    19889
    57      2015-03-12       1-101-1001-10001       KJSKLDJDSKL  BPV-57   2000       57     1-101-1001-10004        1000     dlksjkl    BPV-57            1887      2015-03-10  kdfjhdfj    19889
    57      2015-03-12       1-101-1001-10001       KJSKLDJDSKL  BPV-57   2000       57     1-101-1002-10002        1000     lskdsj     BPV-57            1878      2015-03-10  kjhdk       8787
    57      2015-03-12       1-101-1001-10001       KJSKLDJDSKL  BPV-57   2000       57     1-101-1001-10004        1000     dlksjkl    BPV-57            1878      2015-03-10  kjhdk       8787

【问题讨论】:

when i combine TableCheque list with these two tables i get results but not as desired.. 想要的输出是什么,你现在得到什么? 正如我解释的那样,所需的输出应该根据 BPVCODE 给出两行检查列表,因为它包含两行针对该 bpv 代码,但上面的查询给了我 4 行。 能否包含表格的示例数据和所需的输出插图。 4 行正是人们所期望的,考虑到您的数据和连接。您有一行要连接到一个表中的另外 2 行,以及另一个表中的 2 行。因此,您将获得 2 * 2 = 4 行。你能解释一下为什么你期待 2 行吗?听起来您认为 TBLChequeList 中的一条记录应该对应 TBLBVDetails 中的一条记录,这意味着您总共会得到两行,但是您认为这些记录将如何链接? 太好了,那么您只需要弄清楚如何将这些记录中的数据相互链接。显然,BPVCode/BankVoucherCode 是不够的,因为它们与 2 和 3 相同。如果知道为什么需要 1 和 4,那么您必须将其包含在查询中。如果您的表格中没有 nothing 来建立该链接,那么 that 就是您的问题 :) 【参考方案1】:

目前表 TBLBPVDetails 和 TBLChequeList 之间的逻辑是多对多的,所以查询会显示所有可能的组合 1*2*2 = 4

您应该在表 TBLBPVDetails 和 TBLChequeList 之间找到或创建一对多链接 创建链接的可能方法是为表 TBLBPVDetails 和 TBLChequeList 添加主键,或添加列 TBLBPVDetails.ChequeNo 并使用以下查询:

    SELECT TBLBPVMaster.*,TBLBPVDetails.*,TBLChequeList.*
FROM   TBLBPVDetails 
       INNER JOIN TBLBPVMaster 
       ON TBLBPVDetails.BPVId = TBLBPVMaster.BPVId 
       INNER JOIN TBLChequeList 
       ON TBLBPVDetails.ChequeNo = TBLChequeList.ChequeNo 
WHERE  TBLBPVMaster.BPVId=57

第二种可能(但不是最好的)方法是隐藏可选字段并使用 distinct 抑制重复记录

    SELECT distinct TBLBPVMaster.*,TBLBPVDetails.BPVId, TBLBPVDetails.Amount, TBLChequeList.*
FROM   TBLBPVDetails 
       INNER JOIN TBLBPVMaster 
       ON TBLBPVDetails.BPVId = TBLBPVMaster.BPVId 
       INNER JOIN TBLChequeList 
       ON TBLBPVMaster.BPVCode = TBLChequeList.BankVoucherCode
WHERE  TBLBPVMaster.BPVId=57

【讨论】:

以上是关于Sql Inner 连接没有给出想要的结果的主要内容,如果未能解决你的问题,请参考以下文章

SQL中inner join,outer join和cross join的区别

SQL_连接(Join),内部连接(INNER JOIN),左连接(LEFT JOIN ),右连接(RIGHT JOIN)完整外部连接(FULL OUTER JOIN),自连接(Self JOIN)(

sql四种连接方式

SQL中inner join,outer join和cross join的区别

sql中left join、right join、inner join有啥区别?

inner join(内连接)left join(左连接)right join(右连接)full join(全连接)区别