【问题标题】:how do i write a proper inner join query我如何编写正确的内部连接查询
【发布时间】:2019-06-14 16:28:39
【问题描述】:

我正在尝试使用内连接语法在一个查询中合并两个表记录。

table one

Unique_ID | School | Paid | Balance | Date  |
+---------+--------+------------- --+-------+
 112     MaryGold   200     500    2/5/19 
 112     MaryGold   300     200    9/5/19 
 107      MyKids    100     500    9/5/19 
 107      MyKids    100     400    2/6/19


and table two

Unique_ID | School | amountperterm | Academic_Year | Term | c_Paid | c_Balance |
+---------+--------+---------------+---------------+------+--------+-----------+
 112     MaryGold       700          2019 / 2020     1     500        200
 107      MyKids        600          2019 / 2020     1     200        400


表一显示每笔付款和余额的记录
表二显示了所有支付的总和和余额的记录

我想要一个连接查询,其中表 2 中的学校记录将链接到表 1 中的所有付款记录。

我正在使用 jasper 报告打印出所有学校记录及其各自的账单..
此代码适用于在 Jtable 中选择学校记录并按下 print_button 的情况。

int row = s_ThirdTerm.getSelectedRow();
            try{
            String table_click=(s_ThirdTerm.getModel().getValueAt(row,0).toString());    
            JasperDesign jd =JRXmlLoader.load("printOuts\\ucmasReciept.jrxml");
            String sgl="select school_info.Unique_ID,school_info.School,school_info.amountperterm,school_info.Academic_Year,school_info.Term,school_info.currentallpaid,school_info.currentbalance,school_info.currentdate,school_bill_archive.Paid,\n" +
            "school_bill_archive.Balance,school_bill_archive.Date from school_bill_archive INNER JOIN school_info on school_info.Term=school_bill_archive.Term and school_info.Unique_ID=school_bill_archive.Unique_ID and school_info.School='"+table_click+"'";
            JRDesignQuery newQuery = new JRDesignQuery();
            newQuery.setText(sgl);
            jd.setQuery(newQuery);
            JasperReport jr = JasperCompileManager.compileReport(jd);
            JasperPrint jp = JasperFillManager.fillReport(jr,null,con);
            JasperViewer.viewReport(jp,false);

        }catch(Exception e){
            JOptionPane.showMessageDialog(null,e);

        }finally{
            try{
                rs.close();
                pst.close();
            }
            catch(Exception e){
            }
            }

它在表 2 中显示所选学校,并在表 1 中显示其账单支付的所有记录。

但我想要一种情况,我不会选择特定学校,但是当我点击 print_button 时,jasper 报告应该打开所有学校的记录及其各自的付款记录。

例如。如果我在表 2 中有 5 所学校,那么当我按下 print_button 时,我应该在 jasper 报告中有 5 页。每个页面都包含表 2 中的学校信息以及表 1 中的相应付款。

这是我编写的代码,但它所做的只是显示一个页面,其中包含表 2 中第一行的记录和表 1 中的所有记录。

            try{

            JasperDesign jd =JRXmlLoader.load("printOuts\\Reciept.jrxml");
            String sgl="select school_info.Unique_ID,school_info.School,school_info.amountperterm,school_info.Academic_Year,school_info.Term,school_info.currentallpaid,school_info.currentbalance,school_info.currentdate,school_bill_archive.Paid,\n" +
            "school_bill_archive.Balance,school_bill_archive.Date from school_bill_archive INNER JOIN school_info on school_info.Term=school_bill_archive.Term and school_info.Unique_ID=school_bill_archive.Unique_ID and school_info.School=school_bill_archive.School";
            JRDesignQuery newQuery = new JRDesignQuery();
            newQuery.setText(sgl);
            jd.setQuery(newQuery);
            JasperReport jr = JasperCompileManager.compileReport(jd);
            JasperPrint jp = JasperFillManager.fillReport(jr,null,con);
            JasperViewer.viewReport(jp,false);

        }catch(Exception e){
            JOptionPane.showMessageDialog(null,e);

        }finally{
            try{
                rs.close();
                pst.close();
            }
            catch(Exception e){
            }
            }


【问题讨论】:

  • edit 提出您的问题,并将表的结构包含为CREATE TABLE 语句,一些示例数据为INSERT INTO 语句以及该示例数据的所需结果。就您目前的问题而言,尚不清楚它实际上是关于什么的。
  • 为什么 school_info 会有一个“学期”属性?我的第一个猜测是,您的表格布局不正确。但如果您需要帮助,您确实需要向我们展示表格结构。
  • 您为什么希望此查询过滤特定学校的付款?您查询中的特定学校在哪里?
  • 如果您在 school_bill_archive 中引用 school_info,为什么加入不在 school_info.Unique_ID 上?
  • 另外,请在每个连接表上使用别名。它使查询更具可读性。

标签: mysql sql


【解决方案1】:

如果您想查看特定学校的所有付款,您需要在查询中添加过滤器,如下所示-

SELECT
<columns>
FROM school_info si
INNER JOIN school_bill_archive sba
ON si.Unique_ID = sba.Unique_ID -- This should be the joining key
WHERE si.Unique_ID = XX -- Replace XX with desire Unique ID
AND si.term = '<Put Term Value>'-- You can also filter by particular term if required

【讨论】:

  • 感谢您的回答。但它加入了学校记录,所有学校都完成了所有付款@mkRabbani
  • 表一有学校名称的记录。所以 5 条记录意味着 5 所不同的学校。表二有学校支付的记录。每行包含单次付款的记录。所以一所学校可以有多个行来完成不同的付款。我想要一个连接,这样学校记录将链接到表 2 中的单个或多个数字付款。通过 Unique_ID 或 School_Name @mkRabbani
  • 加入“si.Unique_ID = sba.Unique_ID”应该会给出您预期的输出。它应该只返回您的预期结果。你能从两个表中发布一些示例数据吗?
  • 请用示例数据更新我的问题@mkRabbani
  • @RodneyNart 您能否也从这些表中添加您的预期输出?
猜你喜欢
  • 2017-11-16
  • 1970-01-01
  • 2016-02-25
  • 2018-10-08
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 2021-01-16
  • 2019-06-17
相关资源
最近更新 更多