Sql 正在为简单的连接而挣扎

Sql 正在为简单的连接而挣扎,sql,postgresql,Sql,Postgresql,我觉得我把问题复杂化了。我有两张桌子: orders: - order_id order_products: - order_id - status 如果每个订单产品都可以有一个独立的状态(例如:shipped、Backorder等),我希望能够编写一个查询,告诉我“显示其产品已全部发货的所有订单”。这有点棘手,因为它不仅仅是一个“简单连接”。有几种方法可以做到这一点。一种方法使用聚合和具有子句的: select op.order_id from order_products op grou

我觉得我把问题复杂化了。我有两张桌子:

orders:
- order_id

order_products:
- order_id
- status

如果每个订单产品都可以有一个独立的状态(例如:shipped、Backorder等),我希望能够编写一个查询,告诉我“显示其产品已全部发货的所有订单”。

这有点棘手,因为它不仅仅是一个“简单连接”。有几种方法可以做到这一点。一种方法使用聚合和具有子句的

select op.order_id
from order_products op
group by op.order_id
having sum(case when op.status = 'shipped' then 1 else 0 end) = count(*);
也就是说,计算状态为shipped的行数,并确保给定行的所有行数都为shipped。如果您想了解有关订单的更多信息,也可以加入该表

另一种方法使用
join
,如下所示:

select op.*
from orders o join
     order_products op
     on o.order_id = op.orderId and op.status <> 'shipped';
选择op*
从命令到加入
订购产品op
o.order_id=op.orderId和op.status‘shipped’;

这将返回所有状态为“已发货”的产品实例。如果您只需要订单信息,可以使用
selectdistinct o.*
而不是
selectop.*

这有点棘手,因为它不仅仅是一个“简单连接”。有几种方法可以做到这一点。一种方法使用聚合和具有
子句的

select op.order_id
from order_products op
group by op.order_id
having sum(case when op.status = 'shipped' then 1 else 0 end) = count(*);
也就是说,计算状态为shipped的行数,并确保给定行的所有行数都为shipped。如果您想了解有关订单的更多信息,也可以加入该表

另一种方法使用
join
,如下所示:

select op.*
from orders o join
     order_products op
     on o.order_id = op.orderId and op.status <> 'shipped';
选择op*
从命令到加入
订购产品op
o.order_id=op.orderId和op.status‘shipped’;

这将返回所有状态为“已发货”的产品实例。如果您只需要订单信息,可以使用
selectdistinct o.*
而不是
selectop.*

这有点棘手,因为它不仅仅是一个“简单连接”。有几种方法可以做到这一点。一种方法使用聚合和具有
子句的

select op.order_id
from order_products op
group by op.order_id
having sum(case when op.status = 'shipped' then 1 else 0 end) = count(*);
也就是说,计算状态为shipped的行数,并确保给定行的所有行数都为shipped。如果您想了解有关订单的更多信息,也可以加入该表

另一种方法使用
join
,如下所示:

select op.*
from orders o join
     order_products op
     on o.order_id = op.orderId and op.status <> 'shipped';
选择op*
从命令到加入
订购产品op
o.order_id=op.orderId和op.status‘shipped’;

这将返回所有状态为“已发货”的产品实例。如果您只需要订单信息,可以使用
selectdistinct o.*
而不是
selectop.*

这有点棘手,因为它不仅仅是一个“简单连接”。有几种方法可以做到这一点。一种方法使用聚合和具有
子句的

select op.order_id
from order_products op
group by op.order_id
having sum(case when op.status = 'shipped' then 1 else 0 end) = count(*);
也就是说,计算状态为shipped的行数,并确保给定行的所有行数都为shipped。如果您想了解有关订单的更多信息,也可以加入该表

另一种方法使用
join
,如下所示:

select op.*
from orders o join
     order_products op
     on o.order_id = op.orderId and op.status <> 'shipped';
选择op*
从命令到加入
订购产品op
o.order_id=op.orderId和op.status‘shipped’;

这将返回所有状态为“已发货”的产品实例。如果您只需要订单信息,可以使用
select distinct o.*
而不是
select op.*

一种方法是查找所有订单,其中不存在除已发货状态以外的任何项目

SELECT * 
  FROM orders o 
 WHERE NOT EXISTS(
         SELECT 1 
           FROM order_products p 
          WHERE o.order_id=p.order_id 
            AND status <> 'shipped'
       )
选择*
从命令
不存在的地方(
选择1
来自订单产品p
其中o.order\u id=p.order\u id
和状态“已装运”
)
在SQL Server中,这种不存在的查询通常比使用联接更有效。我对postgresql没有把握


当然,这是假设已装运是终端状态。否则我们;d需要说明状态的顺序等。它还假设所有订单都有项目,因为没有处于任何状态的项目的订单也符合标准。后者似乎是一个非常安全的假设。

一种方法是查找所有订单,其中不存在除已发货以外状态的任何项目

SELECT * 
  FROM orders o 
 WHERE NOT EXISTS(
         SELECT 1 
           FROM order_products p 
          WHERE o.order_id=p.order_id 
            AND status <> 'shipped'
       )
选择*
从命令
不存在的地方(
选择1
来自订单产品p
其中o.order\u id=p.order\u id
和状态“已装运”
)
在SQL Server中,这种不存在的查询通常比使用联接更有效。我对postgresql没有把握


当然,这是假设已装运是终端状态。否则我们;d需要说明状态的顺序等。它还假设所有订单都有项目,因为没有处于任何状态的项目的订单也符合标准。后者似乎是一个非常安全的假设。

一种方法是查找所有订单,其中不存在除已发货以外状态的任何项目

SELECT * 
  FROM orders o 
 WHERE NOT EXISTS(
         SELECT 1 
           FROM order_products p 
          WHERE o.order_id=p.order_id 
            AND status <> 'shipped'
       )
选择*
从命令
不存在的地方(
选择1
来自订单产品p
其中o.order\u id=p.order\u id
和状态“已装运”
)
在SQL Server中,这种不存在的查询通常比使用联接更有效。我对postgresql没有把握


当然,这是假设已装运是终端状态。否则我们;d需要说明状态的顺序等。它还假设所有订单都有项目,因为没有处于任何状态的项目的订单也符合标准。后者似乎是一个非常安全的假设。

一种方法是查找所有订单,其中不存在除已发货以外状态的任何项目

SELECT * 
  FROM orders o 
 WHERE NOT EXISTS(
         SELECT 1 
           FROM order_products p 
          WHERE o.order_id=p.order_id 
            AND status <> 'shipped'
       )
选择*
从命令
不存在的地方(
选择1
来自订单产品p
其中o.order\u id=p.order\u id
和状态“已装运”
)
在SQL Server中,这种不存在的查询通常比使用联接更有效。我不是苏