首页 > 解决方案 > 在 Java 中的本机 postgres 查询中计数查询未返回所需的结果。如何检查不存在的记录?

问题描述

在 java 应用程序中,我有一个本机查询,它应该计算表中的记录。数据库是postgres。

  @Query(nativeQuery = true, value = "SELECT " +
            "COUNT(DISTINCT pd.id) FILTER (WHERE c.value = '100') AS \"100\",  " +
            "COUNT(DISTINCT pd.id) FILTER (WHERE c.value = '200') AS \"200\",  " +
            "COUNT(pd.id) FILTER (WHERE c.value = 'No' or c.value = 'A') AS \"special\", " +
            "COUNT(DISTINCT pd.id) FILTER (WHERE c.value NOT IN ('200', '100', '', 'A', 'No')) AS \"old\",  " +
            "COUNT(pd.id) FILTER (WHERE c.value = '') AS \"missing\" " +
            "FROM big_table bt " +
            "INNER JOIN product_data pd ON pd.id = bt.product_data_id " +
            "INNER JOIN component c ON c.id = pd.componentid " +
            "WHERE bt.big_id = :bigId " +
            "AND (pd.status_id not in (20, 19, 62) or pd.status_id IS NULL)")
    List<Object[]> getData(@Param("bigId") long bigId);

'100'、'200'、'old' 和 'special' 似乎返回了正确数量的结果。

“失踪”没有。'missing' 不会返回未达到 'component' 表中的 'value' 列的情况。例如,有些记录没有componentid,也没有数据,例如'value'数据。不返回这些记录。

所以我尝试了:

"COUNT(pd.id) FILTER (WHERE c.value = '' OR c.value IS NULL) AS \"missing\" " +

但它仍然为每个计算相同的数字。

然后我删除了“旧”的查询,因为它是一个 NOT IN 查询,但仍然有相同数量的“缺失”结果。

重申一下,product_data 表有一个引用组件表的 componentid 列。在组件表中,有一个名为“值”的列,其中包含需要计算的不同类型的值。如果'value'是'100',它会被正确地计入'100'。如果它是 ' '(空白),它会被正确计入 'missing' 中。

但是,如果该组件的条目不存在(例如:product_data 引用了组件 ID 100,000,但该记录在组件表中不存在),则“值”值不会被计为“缺失” . 我在这里想念什么?

标签: javamysqlpostgresql

解决方案


推荐阅读