如果*

时间:2016-08-23 12:30:30

标签: sql database

我有一组服务作业的数据,我想识别仍然安装旧部件的客户(部分x),但如果该客户有新的替换部件(部分y),那么我不希望他们填充我的数据。我能描述它的最好方法就是召回。现在每个Job都有一个数字,这个数字总是随着客户的新工作而增加。所以我正在寻找安装的地方(部分x)(部分y)没有。客户都拥有与任何工作相关联的客户编号。在我的下面的例子中,客户(12373,12369,12349)将出现在我的列表中但是客户(12365,不会因为他们在数字更高的工作上升级到y部分#。

example table

任何帮助都会很棒,是sql的新手

2 个答案:

答案 0 :(得分:1)

我的版本:)

SELECT
    t1.* 
FROM
    `table` AS t1
    LEFT JOIN (
        SELECT
            `Customer Number` 
        FROM
            `table`
        WHERE
            `Parts` > 'part x'
    ) AS t2
        ON ( t1.`Customer Number` = t2.`Customer Number` )
WHERE
    t1.`Parts` = 'part x'
    AND t2.`Customer Number` IS NULL

答案 1 :(得分:0)

一般sql语法。在一些现代DBMS中可以稍微短一点,但当(customerNumber,jobNumber)上的索引存在时,性能应该足够好。

select customerNumber, jobNumber, parts
from theTable t1
where parts='part x' and not exists (
    select 1 
    from theTable t2 
    where t2.customerNumber = t1.customerNumber 
          and t2.jobNumber > t1.jobNumber
          and t2.parts='part y')