当前位置: 首页 > 知识库问答 >
问题:

Not IN嵌套SELECT不工作-没有返回结果-Postgres[重复]

方建明
2023-03-14

我的头撞在墙上。。我有两个表,订单和批次。我正在使用PostgreSQL 9。

这些查询按照我的预期工作并返回结果:

查询#1(正常工作,返回订单#12、#8等):

SELECT "orders".* 
FROM "orders" 
    INNER JOIN "batches" ON "batches"."order_id" = "orders"."id" 
WHERE (order_id not IN (14,4,13,5,2,9,3,7,11));

查询#2(正常工作,返回具有批次的唯一订单ID,这些批次的估计结束日期晚于2019-08-06-与上面列出的数字相同):

SELECT DISTINCT "batches"."order_id" 
FROM "batches" 
WHERE (estimated_end_date >= '2019-08-06');

但是,如果将select查询#2替换为数字列表,则返回的结果与查询#1的结果不同:

SELECT "orders".* 
FROM "orders" 
    INNER JOIN "batches" ON "batches"."order_id" = "orders"."id" 
WHERE (order_id not IN (SELECT DISTINCT "batches"."order_id"          
                                FROM "batches" 
                                WHERE (estimated_end_date >= '2019-08-06')))

我做错了什么?如何使嵌套子查询正常工作?谢谢您!

共有3个答案

吕华彩
2023-03-14

您可以转换此查询

SELECT "orders".* 
FROM orders 
    INNER JOIN "batches" ON "batches"."service_order_id" = "service_orders"."id" 
WHERE (service_order_id not IN (SELECT DISTINCT "batches"."service_order_id"          
                                FROM "batches" 
                                WHERE (estimated_end_date >= '2019-08-06')))

到联接

SELECT orders.* 
FROM orders 
INNER JOIN "batches" ON "batches"."service_order_id" = orders.id 
LEFT JOIN batches AS S ON s.service_order_id = orders.id and s.estimated_end_date >= '2019-08-06'
WHERE S.service_order_id is null
陈淳
2023-03-14

不要将not in与子查询一起使用。如果任何返回的值都是null,那么您将根本不会得到任何结果。改用不存在

SELECT so.* 
FROM service_orders so INNER JOIN
     batches b
     ON b.service_order_id = so.id
WHERE NOT EXISTS (SELECT          
                  FROM batches b2
                  WHERE b2.estimated_end_date >= '2019-08-06' AND
                        b2.service_order_id = b.service_order_id
                );

有更简单的方法来表达这种逻辑,例如使用窗口函数:

SELECT so.* 
FROM service_orders so INNER JOIN
     (SELECT b.*,
             MAX(b.estimated_end_date) OVER (PARTITION BY b.service_order_id) as max_eed
      FROM batches b
     ) b
     ON b.service_order_id = so.id
WHERE max_eed <= '2019-08-06' ;
东门修能
2023-03-14

添加条件:

"batches"."order_id" IS NOT NULL

在子查询中避免将order_idnulls进行比较:

SELECT "service_orders".* 
FROM "service_orders" INNER JOIN "batches" 
ON "batches"."order_id" = "orders"."id" 
WHERE order_id not IN (
  SELECT DISTINCT "batches"."order_id"          
  FROM "batches" 
  WHERE estimated_end_date >= '2019-08-06' AND "batches"."order_id" IS NOT NULL
)
 类似资料:
  • 问题内容: 我试图在postgres函数内返回查询结果。我尝试了一下,并完美地工作了: 问题是我需要一些东西来返回以下结果: 我需要什么回报,或者应该改变什么才能实现这一目标? 问题答案: 这可以通过一个简单的SQL函数来完成: 可以在手册中找到更多详细信息和示例:http : //www.postgresql.org/docs/current/static/xfunc-sql.html#XFUN

  • 问题内容: 我有这个映射: 而这个查询: 我等待25个结果,因为我有25个后索引。但是我得到一个空集。如果我删除嵌套的过滤器,一切正常。我希望能够过滤嵌套对象 在我的设置中,我有: 我在这里缺少什么。 谢谢 问题答案: 简短版本: 尝试此操作(更新端点和索引名称后): 它对我有用,并且简化了您的设置。稍后,我将发布带有较长解释的编辑。 编辑:长版: 查询的问题是分析器与查询中的过滤器结合在一起。您

  • 我很好奇是否可以在以下情况下使用orElseThrow(),或者是否有更Java的8种方法可以将其等效为1行?

  • 我遇到了一些实际的问题,比如使用字段增强来处理ElasticSearch。我已经看过关于这个主题的Nest文档,但它们没有特别大的帮助,所以我的代码实际上是基于这个问题的解决方案:使用Nest Field Boosting进行弹性搜索。 如果运行以下查询,我会得到一个结果,正如预期的那样: 然而,如果我尝试使用场增强,使用以下方法,我没有得到匹配: .OnFieldsWithBoost(d=>d.

  • 我正在尝试用结果映射部分测试MyBatis的用户手册。Mybatis版本:Mybatis-3.1.0 为什么没有调用getAuthor?难道不应该在我调用getBlog()时调用它吗?

  • 我有这个方法,我首先检查一个用户是否是admin,如果你是admin,你将从数据库中得到一个用户列表。但是VS告诉我,我必须在IF admin括号之外再加上一个返回,我完全失去了我应该返回什么?因为你不是管理员,所以你不能返回任何东西