SQL选择具有特定值的重复行

时间:2019-02-13 00:42:08

标签: mysql sql ms-access

我有一个表(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          |
|------------|---------|-------------|------------|

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以将条件放在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 

答案 1 :(得分:0)

您可以在查询中添加WHERE EXISTS子句,以检查表中某处的Disposition值为P的产品:

WHERE EXISTS (SELECT * 
              FROM JobLog A1
              WHERE A1.ProductCode = A.ProductCode AND A1.Disposition = 'P')

或者,您可以进行另一个自我加入:

JOIN JobLog C
ON C.ProductCode = A.ProductCode AND C.Disposition = 'P'

答案 2 :(得分:0)

我相信您无需使用汇总即可满足您的要求。您可以简单地使用WHERE EXISTS条件来确保当前ProductCode / AmtHeld元组至少有两个记录,并且其中一个记录具有处置P。

SELECT A.ProductName, A.ProductCode, A.AmtHeld, A.Disposition
FROM JobLog AS A 
WHERE EXISTS (
    SELECT 1 FROM JobLog B
    WHERE 
        A.ProductCode = B.ProductCode 
        AND A.AmtHeld = B.AmtHeld
        AND A.Disposition <> B.Disposition
        AND (A.Disposition = 'P' OR B.Disposition = 'P') 
)

This DB Fiddle 和示例数据返回:


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