从视图中选择与精确值集匹配的行

时间:2014-09-12 09:17:46

标签: mysql sql

我有一个shipping视图,其中包含两列:pack list (PL)orders

我想在特定集合中选择包含完全 pack list的所有orders

约束:

  • 订单可以有多个包装清单,包装清单可以有多个订单。
  • 这是一个视图,因此可以重复行。

样品:

+----+--------+
| PL | orders |
+----+--------+
|  1 |   a    |
+----+--------+
|  1 |   b    |
+----+--------+
|  1 |   c    |
+----+--------+
|  2 |   c    |
+----+--------+
|  2 |   c    |
+----+--------+
|  3 |   a    |
+----+--------+
|  3 |   c    |
+----+--------+
|  4 |   a    |
+----+--------+
|  4 |   b    |
+----+--------+
|  5 |   a    |
+----+--------+
|  5 |   c    |
+----+--------+
|  5 |   c    |
+----+--------+

我希望PL完全具有订单ac - > 35

我已经找到了这个有效的解决方案:

SELECT PL FROM shipping WHERE PL NOT IN
  (SELECT PL FROM shipping WHERE orders NOT IN('a','c'))
GROUP BY PL HAVING count(DISTINCT orders) = 2;

但我认为可以做更干净的事情,例如不依赖于集合中的订单数量,或者可能使用ROLLUP函数。

为了测试目的,我已经完成了SQL Fiddle,这里我创建了一个表,而不是一个将自动增量ID添加为primary key的视图(但出于某种原因,自动增量不是'工作,也许我错过了一些语法)。

是否还有其他方法可以构建此查询?

1 个答案:

答案 0 :(得分:0)

这些方面的东西:

SELECT PL 
FROM shipping 
GROUP BY PL
HAVING count(DISTINCT orders) = 2
  AND count(DISTINCT CASE WHEN orders IN('a','c') THEN orders ELSE NULL END) = 2