我习惯于创建基本查询,因此我陷入了相当复杂的问题。
Order Number Order Line Package Part Number Size Cost Reviewed
0001 1 1 A1 S 22.5 Yes
0001 1 1 B2 M 33.1 Yes
0001 1 1 C3 L 11.2 Yes
0001 1 2 A1 XL 15.0 Yes
0001 1 3 A2 M 12.0 Yes
0001 2 1 D1 S 42.9 Yes
0002 1 1 B4 L 72.5 No
0002 1 2 A7 XXL 66.7 No
0002 2 1 C1 XL 11.8 Yes
0002 2 1 B1 S 22.3 Yes
0003 1 1 A1 L 55.2 Yes
我想选择订单号,订单行和包裹。我必须按部件号,尺寸,成本和是否已审核进行搜索。这个表有大约30,000个订单,所以有多个结果(这就是我想要的)。我得到了简单的部分,它正常工作。例如:
SELECT
ORDER Number,
ORDER Line,
Package
FROM TABLE
WHERE (Part Number='A1'
AND SIZE='S'
AND Cost='22.5'
AND Reviewed='Yes')
GROUP BY ORDER Number,
ORDER Line,
Package
HAVING count(ORDER Number)=1
Order Number Order Line Package
0001 1 1
这是我的挑战。我必须排除具有订单行的结果,其中包<> 1.因此,我的上述示例的结果将被排除,因为订单号0001 - 订单行1包含2和3的包。当应用此排除时,我提供的表中唯一有效的结果应该是......
Order Number Order Line Package
0001 2 1
0002 2 1
0003 1 1
不要担心空值。性能是一个问题(显然),因为它是一个大表。我环顾四周,但我还没有找到任何可靠的解决方案。您的指导将不胜感激。
答案 0 :(得分:3)
这将排除匹配order_number和order_line的记录,这些记录的包不是1:
SELECT
ORDER_Number,
ORDER_Line,
Package
FROM
aTABLE
WHERE NOT EXISTS (SELECT 1
FROM atable AS b
WHERE atable.order_number = b.order_number
AND atable.order_line = b.order_line
AND b.Package != 1)
GROUP BY ORDER_Number,
ORDER_Line,
Package
答案 1 :(得分:1)
这可能有点苛刻,并没有很好的表现,但我之前使用过类似的东西。
SELECT ORDERNumber,
ORDERLine
FROM orders
GROUP BY ORDERNumber,
ORDERLine
HAVING SUM(CASE WHEN package = 1 THEN 0 ELSE 1 END)= 0
ORDER BY ordernumber,
orderline
<强> sqlFiddle 强>
答案 2 :(得分:0)
如果使用MYSQL,则使用派生表。 基本上,这是有效的,因为它创建了一个包含&lt;&gt;包的所有订单行的临时小型派生表。 1.然后我们以NOT条件加入主查询。
SELECT
d1.ORDERNumber,
d1.ORDERLine,
d1.Package
FROM data d1,
(select distinct ORDERLINE,
PACKAGE from data
where NOT Package = 1)
as d2
WHERE (PartNumber='A1'
AND SIZE='S'
AND Cost=22.5
AND Reviewed='Yes'
AND NOT d1.orderline = d2.orderline)
GROUP BY ORDERNumber,
ORDERLine,
Package
HAVING count(ORDERNumber)=1