如何使用SQL子查询计算表中的行数,并根据结果通过/失败java测试?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (144)

下面是我的两个SQL Server表。

Taddress

addressId | addressName |
2         | testAddress |

TLINK

linkId | clientId | addressId |
1      | 4        | 2         |

我正在尝试编写一个使用SQL子查询来检查taddress中是否存在记录的java测试。

例如:

SELECT COUNT(*) FROM Taddress
WHERE addressId =
(SELECT addressId FROM Tlink
WHERE clientId = param)

目前,当我运行以下测试时,即使tLink中不存在clientId参数,测试也会一直通过。

try {
        dbAccessSetUp();
        ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM taddress a INNER JOIN tlink l on a.address_id = l.internal_address_id WHERE l.ext_client_id =" + this.clientNo);

        if(!rs.next()) {
            fail("Record does not exist in taddress based on ExtClientNo");
        }

        int count = 0;

        while(rs.next()) {              

            count = rs.getInt(1);
            System.out.println("number of count : " + count);
            assertTrue(0 < count);
        } 
        rs.close(); 
    } catch(SQLException se) { 
        se.printStackTrace(); 
        assertEquals(true, false);
    } catch(Exception e) { 
        e.printStackTrace();
        assertEquals(true, false);
    } finally { 
        try { 
            if(stmt!=null) stmt.close();  
        } catch(SQLException se2) {
            assertEquals(true, false);
        } 
        try { 
            if(conn!=null) conn.close(); 
        } catch(SQLException se) {
            se.printStackTrace(); 
            assertEquals(true, false);
        } 
    } 
提问于
用户回答回答于

提出您的疑问:

SELECT COUNT(*) 
FROM taddress a INNER JOIN tlink l on a.addressid = l.addressID
WHERE l.clientid = @param

如果出现以下情况,则返回0:

  • 没有关于那个参数的链接
  • 没有tlink的taddress

如果你想知道关系破裂的地方:

SELECT COUNT(*) as count_link, COUNT(a.addressid) as count_address 
FROM taddress a RIGHT JOIN tlink l on a.addressid = l.addressID
WHERE l.clientid = @param

关于你断言计数总是> 0而不管你传递的@param,我想看一些额外的调试/截图/打印输出等,表明

编辑

所以代码的问题是:

你运行sql然后调用 if(!rs.hasNext())

你的结果集确实有一行,所以对rs.next的调用返回true,你否定这个,所以if测试返回false,if不运行,你的结果集现在指向查询的第一行数据。唯一的数据线 - 你现在应该读取数据,但你不...

接下来你说while(rs.hasNext())这会使你的结果集前进另一行,所以它不再指向计数数据。没有更多的数据行,所以这个调用返回false而你的while循环体永远不会运行 - 你永远不会从结果集中提取任何数据,你的断言永远不会运行等等

重新编写代码,以便在第一个if和ditch while循环中执行assert()

if(rs.next())
  assert(rs.getInt(1) > 0);

此表单的计数查询将始终返回一行,测试结果集以确保没有数据。如果查询无法运行,则会生成异常

用户回答回答于

对于你的查询,它将在没有错误的情况下运行,直到在Tlink表中有超过1行,因此最好将其更改为简单的连接

SELECT COUNT(*)
FROM Taddress A INNER JOIN Tlink L ON A.addressId = L.addressId
WHERE L.clientId = Param;

现在,我们同意查询将返回正确的结果,但是您提到的Java代码没有按预期工作

目前,当我使用上述查询运行测试时,即使tLink中不存在clientId参数,测试也会一直通过。

上面的查询将只返回一行(一个值),因此您不需要循环,此代码是无用的

while(rs.next()){
    count = rs.getInt(1);
    assertTrue(0 < count);
}

需要的所有内容都是获取查询返回的值,并检查它是否大于0等等

count =  ((Number) rs.getObject(1)).intValue();
int cmp;
if (count > 0)
// Exists;
else 
//Not exists;

要么

assertTrue(count.equals(0));

扫码关注云+社区

领取腾讯云代金券