首页 > 解决方案 > SQL 选择具有特定值的重复行

问题描述

我有一个包含产品数据的表(JobLog)。我希望能够检查某些字段是否可能已重新提交并输入了两次,但之前可能已被处理过。

我的代码如下:

SELECT A.ProductName, A.ProductCode, A.AmtHeld, A.Disposition
FROM 
    JobLog AS A 
    INNER JOIN (
        SELECT ProductCode, AmtHeld
        FROM JobLog GROUP BY ProductCode, AmtHeld 
        HAVING COUNT(*) > 1
    ) AS B 
        ON (A.ProductCode = B.ProductCode) 
        AND (A.AmtHeld = B.AmtHeld) 

它输出:

|ProductName | AmtHeld | ProductCode | Disposition|
|------------|---------|-------------|------------|
| chocolate  | 123     | 500         | P          |
|------------|---------|-------------|------------|
| chocolate  | 123     | 500         | C          |
|------------|---------|-------------|------------|
| vanilla    | 355     | A30         | C          |
|------------|---------|-------------|------------|
| vanilla    | 355     | A30         | C          |
|------------|---------|-------------|------------|

有没有办法有一个额外的参数,它只会输出具有 Disposition = P 作为行的一部分的行?如,我只想要两种巧克力产品的输出,因为其中一种具有 P 的性格,而不是两种香草,因为它们都具有 C 的性格(没有 P)。

|ProductName | AmtHeld | ProductCode | Disposition|
|------------|---------|-------------|------------|
| chocolate  | 123     | 500         | P          |
|------------|---------|-------------|------------|
| chocolate  | 123     | 500         | C          |
|------------|---------|-------------|------------|

提前致谢!

标签: mysqlsqlms-access

解决方案


您可以将条件放在HAVING子句中:

SELECT A.ProductName, A.ProductCode, A.AmtHeld, A.Disposition
FROM JobLog AS A INNER JOIN 
    (SELECT ProductCode, AmtHeld
     FROM JobLog
     GROUP BY ProductCode, AmtHeld 
     HAVING COUNT(*) > 1 AND
            SUM(IIF(DISPOSITION = 'P', 1, 0)) > 0
    ) AS B
    ON A.ProductCode = B.ProductCode AND 
       A.AmtHeld = B.AmtHeld 

推荐阅读