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

时间:2015-03-13 10:29:43

标签: sql sql-server join

我想加入三张桌子。当我连接两个表时,查询工作正常 TBLBPVMASTERTBLBPVDETAILS基于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

1 个答案:

答案 0 :(得分:0)

表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

第二种可能(但不是更可取的)方法是隐藏可选字段并使用不同的

来压制dublicate记录
    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