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中inner join,outer join和cross join的区别
sql中left join、right join、inner join有啥区别?
inner join(内连接)left join(左连接)right join(右连接)full join(全连接)区别