Sql 给定一组ID,只返回带有这些ID的订单子集

Sql 给定一组ID,只返回带有这些ID的订单子集,sql,postgresql,amazon-redshift,relational-division,Sql,Postgresql,Amazon Redshift,Relational Division,给定一组产品标识,只有这些产品标识的订单标识是什么 对于下面的示例,我只希望order_ID具有a、b、c的一些组合。我有如下两张表: 交易记录表: 产品表: 所需输出有2个订单ID,具有所需的表格输出: 请注意,虽然order_id==2的产品为_id==a,但它被删除了,但因为它的产品为_id==X,所以它应该被删除 因此,这不是一个简单的问题: SELECT DISTINCT(order_id) FROM transactions WHERE product_id IN (a, b, c)

给定一组产品标识,只有这些产品标识的订单标识是什么

对于下面的示例,我只希望order_ID具有a、b、c的一些组合。我有如下两张表:

交易记录表:

产品表:

所需输出有2个订单ID,具有所需的表格输出:

请注意,虽然order_id==2的产品为_id==a,但它被删除了,但因为它的产品为_id==X,所以它应该被删除

因此,这不是一个简单的问题:

SELECT DISTINCT(order_id)
FROM transactions
WHERE product_id IN (a, b, c)
我们需要定义与您的需求相反的内容,并对其进行过滤。那么,哪些订单至少有一笔交易不在a、b、c中。我们计算订单分组中此类事务的数量,过滤出count>0的订单,只返回count=0的订单

选择订单号 来自交易 按订单分组\u id 当乘积_id不在a、b、c中时具有COUNTCASE,则1 END=0 如果您将a、b、c作为另一个表中的产品列表,并且您希望对其进行过滤,而不是硬编码到查询中,那么它会稍微复杂一些:

选择订单号 从作为t的交易中删除 左连接产品列表,如l.product\U id=t.product\U id上的l 按订单分组\u id 当l.product_id为NULL时具有COUNTCASE,则1 END=0 通常,有一个orders表与之配套,每个订单只有一行

如果我们可以进一步假设每个订单始终至少有一个事务,这将完成以下工作:

选择o.id 从命令 不存在的地方 从事务中选择-对于现有测试,选择列表可以为空 其中order_id=o.id 和乘积_id全部{a,b,c} ; 这对于非常常见的产品id或长列表很有用

对于短名单或稀有产品,首先从正面选择开始会更快。比如:

选择订单号 从…起 选择不同的订单号 来自交易 其中乘积_id=任意{a,b,c} T 不存在的地方 从事务中选择 其中order\u id=t.order\u id 和乘积_id全部{a,b,c} ; 产品id上的索引对于性能至关重要。更好的是,一个关于product_id,order_id的多列索引,再加上另一个关于order_id,product_id的索引。请参阅:

有关数组文字的手册:

关于任意和所有构造:


第二部分我的清单是什么?myList=a,b,c?或者它不是a、b、c列表?a、b、c来自表,而不是直接在查询中。Have ClearifiedOrders已经停止一周了:/如果没有第三个表,您将如何解决?@mitchell reynolds:我添加了另一个查询。我第一次看到“{a,b,c}”的用法时,语法是否允许使用带空格或奇数字符的字符串?比如说“{a,b,c,a-b-c}”,其中a-b-c是一个单数ID@mitchell-雷诺兹:这是一个数组文字。带空格的字符串必须用双引号括起来。我在上面添加了一些链接。与你的问题无关,但是:distinct不是一个函数。它始终适用于“选择”列表中的所有列。用括号括住其中一列不会改变任何东西,也没有用。不同的a,b与不同的a,b或不同的a,b相同
product_id |
------------
     a     |
     b     |
     c     |
     d     |
     X     |
     Y     |
     ...   |
     ZZZ   |
order_id |
----------
    1    |
    3    |

SELECT DISTINCT(order_id)
FROM transactions
WHERE product_id IN (a, b, c)