java - 在 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,但该记录在组件表中不存在),则“值”值不会被计为“缺失” . 我在这里想念什么?
解决方案
推荐阅读
- java - 使用Java 8从(嵌套列表)列表列表中获取最大和最小总和的列表
- neo4j - 在 Neo4J Desktop 中连接到现有的 Graph DB
- php - 从 ajax resposne 下载二进制文件
- c++ - 链表地址不定期
- jquery - 给定一个包含幻灯片的滑块 div,我如何在点击时滚动到下一张幻灯片?
- tensorflow - Keras CNN overfitting for more than four classes
- cassandra - Is there a framework available which could help me in testing DAOs
- c# - 如何在 CloudAMQP 上将 MassTransit 与 RabbitMq 连接起来
- javascript - RegEx mismatch in node.js
- python - Decrypt a encrypted secret using PyCrypto AES & sha256