Sql 内部联接没有给出预期的结果

Sql Inner joins not giving desired results

我想连接三个表。当我连接两个表时查询工作正常 TBLBPVMASTER AND TBLBPVDETAILS 基于 bpvid 但是当我将 TableCheque 列表与这两个表组合时,我得到了结果,但不是我想要的。

例如 TBLBPVMaster 包含一条针对 BPVID 的记录,TBLBPVDETAILS 包含两条针对 BPVID 的记录,而 chequelist 包含两条针对 [=22= 的记录].现在我想合并这三个表,以便结果查询产生两行。以下查询产生 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

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

您应该在表 TBLBPVDetails 和 TBLChequeList 之间查找或创建一对多 link 创建 link 的可能方法是为表 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