排除SQL查询结果 - 单个表

时间:2013-06-05 19:01:07

标签: sql

我习惯于创建基本查询,因此我陷入了相当复杂的问题。

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

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

3 个答案:

答案 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

部分在MySqlSqlServerOracle之间应该是通用的情况。

答案 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

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