3

我习惯于创建基本查询,所以我被困在一个相当复杂的查询上。

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

不要担心空值。性能是一个问题(显然),因为它是一个大表。我环顾四周,但我还没有找到任何可靠的解决方案。您的指导将不胜感激。

4

3 回答 3

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
于 2013-06-05T19:35:22.957 回答
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

零件应该在MySqlSqlServerOracle中通用的情况。

于 2013-06-05T19:18:22.463 回答
0

如果您使用 MYSQL,则使用派生表。基本上,这是有效的,因为它会为所有具有包 <> 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

http://www.sqlfiddle.com/#!2/b391e/8

于 2013-06-05T19:41:54.747 回答