Sql 给定一组ID,只返回带有这些ID的订单子集
给定一组产品标识,只有这些产品标识的订单标识是什么 对于下面的示例,我只希望order_ID具有a、b、c的一些组合。我有如下两张表: 交易记录表: 产品表: 所需输出有2个订单ID,具有所需的表格输出: 请注意,虽然order_id==2的产品为_id==a,但它被删除了,但因为它的产品为_id==X,所以它应该被删除 因此,这不是一个简单的问题: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)
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)