我正在尝试使用内部联接进行查询但不起作用。它显示多个重复的行。问题是我试图通过使用外键来做到这一点。但我无法解决它。 这是第一张表
@OneToOne(cascade=CascadeType.ALL)
@PrimaryKeyJoinColumn
private T1 t1;
第二个表
document_details
id inv_no bill_desc bill_amount
1 201501 test bill 1000
2 201501 test bill2 1110
3 201502 C&F Association Fee 50
4 201502 Duty/Vat& Scanning 3620
5 201502 Agent Charges 1750
6 201502 Noc Charges 1775
7 201502 CPA Charges 3572
8 201502 Hi-Star Charges 1800
9 201502 Exam. Miscellanies 5500
10 201502 Import Miscellanies 5000
11 201502 Commission@0.07% 7272
我正在尝试运行以下sql
bill_details
id inv_no doc_title doc_desc
1 201501 test test details
2 201501 test2 test2
11 201502
10 201502
9 201502 Doc. Recvd:26.08.15 Delivery:22.09.2015
8 201502 Consignmnt:07Plts Printing Chemical
7 201502 C&F$:129896.67 BD.Tk.10388594.28
6 201502 Inv. No:330955 Date:20.07.2015
5 201502 L/C: 100315050139 Date:07.07.2015
4 201502 BL No:WPG0026958 Date:01.08.2015
3:201502 B/E No:C-992168 Date:17.09.2015
答案 0 :(得分:0)
您想要实现的目标通常不是DBMS的任务,而是表示层,即用编程语言编写的GUI程序,例如以网格显示数据。
可以通过为每个发票创建行号并使用文档#1加入发票的帐单#1,使用文档#2加入帐单#2等来完成。
所以
id inv_no bill_desc bill_amount row_number 1 201501 test bill 1000 #1 2 201501 test bill2 1110 #2 3 201502 C&F Association Fee 50 #1
和
id inv_no doc_title doc_desc row_number 1 201501 test test Details #1 2 201501 test2 test2 #2 11 201502 #1
会给你
inv_no bill_desc bill_amount doc_title doc_desc 201501 test bill 1000 test test Details 201501 test bill2 1110 test2 test2 201502 C&F Association Fee 50
您使用完全外部联接,因为您可以拥有比文档更多的帐单,反之亦然。这通常不是一个非常复杂的查询,但是由于缺少row_number()和完全外连接而在MySQL中。
那么一个简单的查询怎么样,每个inv_no只给你一行:
inv_no bill_descs bill_amount doc_titles doc_descs 201501 test bill,test bill2 2110 test,test2 test Details,test2 ...
您可以通过按inv_no聚合数据来实现此目的:
select
bill.inv_no, bill.bill_descs, bill.bill_amount, doc.doc_titles, doc.doc_descs
from
(
select
inv_no,
group_concat(bill_desc) as bill_descs,
sum(bill_amount) as bill_amount
from bill_details
group by inv_no
) bill
join
(
select
inv_no,
group_concat(doc_title) as doc_titles,
group_concat(doc_desc) as doc_descs
from invoicedocument_details
group by inv_no
) doc on doc.inv_no = bill.inv_no;