SQL筛选由查询中的不同列复制

时间:2013-03-22 12:21:13

标签: sql vba

在这个帖子上我有一个问题已成功回答。

searching for filtered duplicates in access query

现在我有第二个问题。也许有人可以帮助我。

我的查询如下:

  1. 查询A_Gravur:

    SP1 | SP2     | SP3
    
     64 | CB75000 | 3
     64 | empty   | D
     70 | CB70010 | 1
     70 | CB70010 | 1
    119 | CB70050 | 5
    119 | empty   | D
    165 | S15002  | Schalter
    165 | S15002  | Schalter
    194 | R70034  | Poti
    194 | R10023  | Potentiometer
    196 | S10063  | Schalter
    196 | S10063  | Schalter
    197 | S10063  | Schalter
    198 | S10070  | 3
    199 | CB75000 | 5
    
  2. 此查询由另一个查询过滤以检查重复项。 最终结果如下:

    结果:

    SP1 | SP2     | SP3
    
    194 | R70034  | Poti 470k
    194 | R10023  | Potentiometer
    196 | S10063  | Schalter
    197 | S10063  | Schalter
     64 | CB75000 | 3
    199 | CB75000 | 5
    

    ,SQL代码如下所示:

      SELECT SP1, SP2, SP3
      FROM A_Gravur
      WHERE (SP1 IN
        (SELECT SP1
          FROM A_Gravur
          WHERE SP3<>'D'
          GROUP BY SP1
          HAVING COUNT(*)>1)
      OR SP2 IN
        (SELECT SP2
          FROM A_Gravur
          WHERE SP3<>'D'
          GROUP BY SP2
          HAVING COUNT(*)>1))
      AND CONCAT(CAST(SP1 AS CHAR),SP2,SP3) NOT IN
        (SELECT CONCAT(CAST(SP1 AS CHAR),SP2,SP3)
          FROM A_Gravur
          WHERE SP3 <> 'D'
          GROUP BY CONCAT(CAST(SP1 AS CHAR),SP2,SP3)
          HAVING COUNT(*)>1)
      AND SP3<>'D'
      ORDER BY SP1, SP2;
    

    现在我的新问题:

    我在查询A_Gravur(SP4和SP5)中添加了2个新列并进行了重复搜索

    SP1 | SP2     | SP3           | SP4     | SP5       |
    
    194 | R70034  | Poti 470k     |123546   |88859     
    194 | R10023  | Potentiometer |88859    |
    196 | S10063  | Schalter      |7773     |
    197 | S10063  | Schalter      |99992    |
     64 | CB75000 | 3             |177777   |
    199 | CB75000 | 5             |99999    |
    

    解释:在SP4中总有值(Materialnumber)。 现在,当我搜索重复项时,它应该只找到这个结果:

    SP1 | SP2     | SP3           | SP4     | SP5       |
    
    196 | S10063  | Schalter      |7773     |
    197 | S10063  | Schalter      |99992    |
     64 | CB75000 | 3             |177777   |
    199 | CB75000 | 5             |99999    |
    

    因为SP5中的数字(88859)也在SP4(88859)中,并且SP1在两个记录中都是相同的数字(194)

    但如果看起来像这样,那么结果是正确的

    SP1 | SP2     | SP3           | SP4     | SP5       |
    
    194 | R70034  | Poti 470k     |123546   |0000001     
    194 | R10023  | Potentiometer |88859    |
    196 | S10063  | Schalter      |7773     |
    197 | S10063  | Schalter      |99992    |
     64 | CB75000 | 3             |177777   |
    199 | CB75000 | 5             |99999    |
    

    感谢您的帮助!!

1 个答案:

答案 0 :(得分:0)

这可能会做你想要的:

SELECT SP1, SP2, SP3, SP4, SP5
FROM A_Gravur
WHERE (SP1 IN
  (SELECT SP1
    FROM A_Gravur
    WHERE SP3<>'D'
    GROUP BY SP1
    HAVING COUNT(*)>1)
OR SP2 IN
  (SELECT SP2
    FROM A_Gravur
    WHERE SP3<>'D'
    GROUP BY SP2
    HAVING COUNT(*)>1))
AND CONCAT(CAST(SP1 AS CHAR), SP2,
    CAST(COALESCE(SP5, SP4) AS CHAR)) NOT IN
  (SELECT CONCAT(CAST(SP1 AS CHAR), SP2,
    CAST(COALESCE(SP5, SP4) AS CHAR))
    FROM A_Gravur
    WHERE SP3 <> 'D'
    GROUP BY CONCAT(CAST(SP1 AS CHAR),SP2,
      CAST(COALESCE(SP5, SP4) AS CHAR))
    HAVING COUNT(*)>1)
AND SP3<>'D'
ORDER BY SP1, SP2, SP3, SP4;

CONCAT()选择第一个非空的字段,因此如果存在则选择SP5,否则选择SP4。

这是SQL Fiddle。如果我没有正确理解,请你修改那里的测试数据,并添加一个注释与新的SQL Fiddle的地址,以便我有好的数据可供使用。