首页 > 解决方案 > SQL 查询将根据另一列中的值省略具有相同 ID 的记录

问题描述

* 更新*

经过进一步审查,我使用的表格也有一linenumber列。请参阅下面的更新示例数据。我觉得这对解决这个问题非常有帮助....只是不确定如何。用 PO 对行号求和,如果等于 1 则为单行,如果大于 1 则为多行....这对我们有什么帮助吗?

这里和 SQL 都是新手,所以请原谅我的无知。希望这是一个简单的答案。

希望构建 3 个类似的查询,这些查询将返回包含超过 1 个项目的采购订单,并且:

  1. 不包含任何批次受控项目
  2. 包含所有批次控制项目
  3. 包含批次控制和非批次控制项目的混合

数据长这样...

PONUMBER    ITEMNUMBER  LOTCONTROLLED  LINENUMBER
PO1.18      OSC1024     0              1
PO1.18      OSC1025     0              2
PO1.18      OSC1026     0              3
PO1.2       OSC1199     0              1
PO1.2       OSC1200     1              2
PO1.21      OSC1201     1              1
PO1.21      OSC1202     1              2
PO1.22      OSC1203     1              1
PO1.23      OSC1204     1              1
PO1.23      OSC1205     0              2
PO1.24      OSC1206     1              1
PO1.24      OSC1207     1              2
PO1.24      OSC1300     0              3

查询无批次受控项目效果很好......

    SELECT 
      `POD`.`PONUMBER`,
      `POD`.`ITEMNUMBER`,
      `POD`.`LOTCONTROLLED`
    FROM
      table1 AS `POD`
    INNER JOIN
      (
        SELECT `PONUMBER`, COUNT(`PONUMBER`)
        FROM table1
        WHERE `LOTCONTROLLED` = 0
        GROUP BY `PONUMBER`
        HAVING (COUNT(`PONUMBER`) > 1)
       ) as `POD1`
     ON `POD`.`PONUMBER` = `POD1`.`PONUMBER`

我认为它就像更改WHERE LOTCONTROLLED为 = 1 一样简单,以获取包含所有批次控制项目的采购订单,但这也会返回一些包含混合行的采购订单。

如果任何一条线不受批次控制,我如何才能从包含中删除采购订单?

标签: mysqlsqlselect

解决方案


我喜欢NOT EXISTS在这里使用:

SELECT POD.*
FROM table1 POD
JOIN (SELECT PONUMBER
      FROM table1 POD
      WHERE NOT EXISTS (SELECT *
                        FROM table1 POD1
                        WHERE POD.PONUMBER = POD1.PONUMBER
                        AND POD1.LOTCONTROLLED = 1)
      GROUP BY PONUMBER
      HAVING COUNT(*) > 1
      ) POD1 ON POD.PONUMBER = POD1.PONUMBER

PONUMBER如果其中的任何记录PONUMBER具有= 1 或 0,这将省略from 结果LOTCONTROLLED,具体取决于您在存在子查询中放置的内容。

要仅获取混合记录,您可以使用COUNT().. HAVING

SELECT PONUMBER,
       ITEMNUMBER,
       LOTCONTROLLED
FROM table1 POD
JOIN (SELECT PONUMBER
      FROM table1
      GROUP BY PONUMBER
      HAVING COUNT(DISTINCT LOTCONTROLLED) = 2
     ) POD1 ON POD.PONUMBER = POD1.PONUMBER

推荐阅读