如何筛选同一BOM下所有Imported值均为True的行?
筛选所有组件已导入的BOM行
要实现只保留同一BOM下所有Imported值均为True的行,可以用以下几种SQL方法:
方法1:先筛选有效BOM再关联原表
先通过分组找到所有无False记录的BOM,再和原表关联获取完整行数据:
SELECT t.* FROM your_table t INNER JOIN ( SELECT BOM FROM your_table GROUP BY BOM -- 若Imported是布尔型,直接用MIN(Imported) = TRUE;若为字符串则调整判断逻辑 HAVING MIN(CAST(Imported AS BIT)) = 1 ) valid_boms ON t.BOM = valid_boms.BOM
逻辑:分组后用MIN函数判断该BOM下所有Imported的最小值,若最小值为True(或转成1),说明没有False记录,属于有效BOM。
方法2:用NOT EXISTS排除含False的BOM
直接判断当前行的BOM是否不存在任何Imported为False的记录:
SELECT * FROM your_table t WHERE NOT EXISTS ( SELECT 1 FROM your_table WHERE BOM = t.BOM AND Imported = 'False' -- 根据实际数据类型调整,比如布尔型用Imported = FALSE )
逻辑:对每一行检查同BOM下有没有False条目,没有则保留该行。
方法3:窗口函数标记有效BOM
用窗口函数给每个BOM添加标记,标记该BOM是否所有Imported都是True,再筛选标记为有效的行:
SELECT BOM, Imported FROM ( SELECT BOM, Imported, -- 按BOM分组计算最小Imported值,全为True则结果为1 MIN(CAST(Imported AS BIT)) OVER (PARTITION BY BOM) AS is_valid_bom FROM your_table ) sub_query WHERE is_valid_bom = 1
逻辑:窗口函数OVER (PARTITION BY BOM)会给同一BOM的所有行计算相同的标记值,筛选标记为1的行即可。
注意事项
- 若
Imported列是原生布尔类型(而非字符串),可去掉CAST(Imported AS BIT),直接用MIN(Imported) = TRUE判断。 - 替换
your_table为实际表名。
内容的提问来源于stack exchange,提问作者Hamish Duff
相关产品推荐
相关产品推荐

