学生上机信息统计——对两张表的联合查询

学生上机信息统计——对两张表的联合查询

 

   在学生上机信息统计中,

  此处,因为要查询两张表,而且两张表查询的先后有时要严格表明,所以,在查询时,有两种思路:

 

   1,定义两个Recordset对象,并根据字段,判断是先查询学生信息表,还是先查询学生上机表

 

   2,两张表有一个共同的字段:卡号,所以,可以根据卡号将两张表连起来查询,这样比较方便。

   因为第一种方式比较复杂,容易出错,所以,我选择了第二种方式,将两张表联合起来。

 

   下面是对两张表联合起来的查询的语句:

学生上机信息统计——对两张表的联合查询

 

查询结果如下:

学生上机信息统计——对两张表的联合查询

 

但是,,实际的时候,用户进行的查询都是有条件的查询,所以,在SQL 语句中还应加上条件。

学生上机信息统计——对两张表的联合查询

 

但是卡号因为在两张表中都存在,所以在查询时,如果不指定是哪张表,会出现不明确的问题,导致查询无法进行。所以,在用卡号作为条件时,应该在卡号前面指定表明,以表明是对哪张表的卡号进行查询。。

 

另外,在查询时,因为并不是所有列的信息我们都要显示给用户,所以,可以指定返回的列:

select Stubaseinfo.卡号,姓名,上机日期,上机时间,下机日期,下机时间,消费金额,金额 from StuBaseInfo ,StuShangJi where StuBaseInfo .卡号=StuShangJi.卡号 and 姓名='刘慧超'

学生上机信息统计——对两张表的联合查询

 

 

组合查询的过程:

   1,输入值的非空和完整性验证

   2,将查询时输入的条件字符转换成数据库的字段名

   3,分别对一个字段,两个字段,三个字段,这三种情况编写SQL语句

 

下面是我的部分代码:

 '查询之前先清空表格结构
    myFlexGrid.ClearStructure
    
    
    
    '如果第一个与或没有选择,下面的文本框都不可用
    '同理,如果第二个文本框没有选择的话,下面的文本框也都不可用
    '这一检查放在了两个change事件里面
    '只有一个查询条件时,只能用第一条;如果有两个查询条件时,只能用前两条;
    
    
    

    ' 查询前,先进行非空判断
    '先判断有三个查询条件的情况
    If Testtxt(Cmb1.Text) = True And Testtxt(Cmb2.Text) = True Then
        If Testtxt(CmbZiDuan1.Text) = False Or Testtxt(CmbZiDuan2.Text) = False Or Testtxt(CmbZiDuan3.Text) = False Then '如果三个字段名中有一个为空的话,提示字段名为空
                MsgBox "字段名不能为空!", vbOKOnly + vbExclamation, "警告"      '提示字段名不能为空
                Exit Sub
            ElseIf Testtxt(CmbCaoZuo1.Text) = False Or Testtxt(CmbCaoZuo2.Text) = False Or Testtxt(CmbCaoZuo3.Text) = False Then '如果操作符为空
                MsgBox "操作符不能为空!", vbOKOnly + vbExclamation, "警告"   '如果操作符为空
                Exit Sub
            Else
                If Testtxt(txtCheck1.Text) = False Or Testtxt(txtCheck2.Text) = False Or Testtxt(txtCheck3.Text) = False Then   '如果要查询的内容有一个为空的话
                    MsgBox "查询内容不能为空!", vbOKOnly + vbExclamation, "警告"    '如果查询内容为空
                    Exit Sub
                End If
        End If
        
        '将组合关系转换成数据库可识别的字符
        If Trim(Cmb1.Text) = "与" Then  '转换组合关系1的字符
            ZuHe1 = "and"
        Else
            ZuHe1 = "or"
        End If
        
        If Trim(Cmb2.Text) = "与" Then   '转换组合关系2的字符
            ZuHe2 = "and"
        Else
            ZuHe2 = "or"
        End If
        
        '将操作符转换为数据库可识别内容,,嘿嘿,不知道大家看不看得出金额和余额......
        If CmbZiDuan1.Text = "余额" Then
            CmbZiDuan1.Text = "金额"
        End If
        
        If CmbZiDuan2.Text = "余额" Then
            CmbZiDuan2.Text = "金额"
        End If
        
        If CmbZiDuan3.Text = "余额" Then
            CmbZiDuan3.Text = "金额"
        End If
        
        '查询前先判断字段是否是卡号,然后根据卡号分情况执行SQL语句
        If CmbZiDuan1.Text = "卡号" Then   '为卡号指定一个表名
            KaHao1 = "stushangji.卡号"
        Else
            KaHao1 = CmbZiDuan1.Text
        End If
        
        If CmbZiDuan2.Text = "卡号" Then   '如果查询的字段为卡号,则必须为卡号指定一个表名
            KaHao2 = "stushangji.卡号"
        Else
            KaHao2 = CmbZiDuan2.Text
        End If
        
        If CmbZiDuan3.Text = "卡号" Then   '如果查询的字段为卡号,则必须为卡号指定一个表名
            KaHao3 = "stushangji.卡号"
        Else
            KaHao3 = CmbZiDuan3.Text
        End If
        
        '执行查询
        SQL = "select Stushangji.卡号,姓名,上机日期,上机时间,下机日期,下机时间,消费金额,金额 from stubaseinfo,stushangji where (StuBaseInfo.卡号=StuShangJi.卡号) and (" & KaHao1 & Trim(CmbCaoZuo1.Text) & "'" & Trim(txtCheck1.Text) & "'" & " " & ZuHe1 & " " & KaHao2 & Trim(CmbCaoZuo2.Text) & "'" & Trim(txtCheck2.Text) & "'" & " " & ZuHe2 & " " & KaHao3 & Trim(CmbCaoZuo3.Text) & "'" & Trim(txtCheck3.Text) & "')"
        Set Rst = ExecuteSQL(SQL, strMsg)     '执行查询

    End If


下面是一个运行时的SQL 语句:

学生上机信息统计——对两张表的联合查询

 

虽然看起来有点复杂,但是基本东西都是一样的。

 

 

 

 

 

 

 

 

 

 

上一篇:将MSHFlexGrid中的数据保存到Excel表


下一篇:爱豆在北京开演唱会,我在杭州要如何与他实时互动?