mysql - SQL 查询将根据另一列中的值省略具有相同 ID 的记录
问题描述
* 更新*
经过进一步审查,我使用的表格也有一linenumber
列。请参阅下面的更新示例数据。我觉得这对解决这个问题非常有帮助....只是不确定如何。用 PO 对行号求和,如果等于 1 则为单行,如果大于 1 则为多行....这对我们有什么帮助吗?
这里和 SQL 都是新手,所以请原谅我的无知。希望这是一个简单的答案。
希望构建 3 个类似的查询,这些查询将返回包含超过 1 个项目的采购订单,并且:
- 不包含任何批次受控项目
- 包含所有批次控制项目
- 包含批次控制和非批次控制项目的混合
数据长这样...
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 一样简单,以获取包含所有批次控制项目的采购订单,但这也会返回一些包含混合行的采购订单。
如果任何一条线不受批次控制,我如何才能从包含中删除采购订单?
解决方案
我喜欢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
推荐阅读
- gradle - 将外部源文件添加到 kotlin 项目
- android - 无法解析符号“菜单”?
- android - 使用 Kotlin 处理错误 RXJava Android
- python - 如何在python中用两个点topLeft点(0,0)和bottomRight点(1,1)初始化一个矩形类?
- python - 如何在 Python 字符串中写入原始字节字符?
- java - java中需要println命令
- android - android studio 3.2 读取密钥失败
- javascript - 如何在 ChartJS 中使用数组存储数据?
- cordova - 使用带有 Cordova 的 Deezer SDK 无法播放超过 30 秒的音乐
- iis - 同一域上的应用程序之间的 ASP 核心导航