查询在多台Computer中出现的Component条目SQL无结果排查
问题分析与解决方案
你的SQL查询没有返回结果,核心问题出在分组逻辑上:
你原语句里GROUP BY Component.Piece, NO_COMPUTER会把每个组件(Piece)和对应的单个电脑编号(NO_COMPUTER)分为一组,每个分组里只会有一个唯一的NO_COMPUTER,所以不管你用COUNT(DISTINCT cpt.NO_COMPUTER)还是普通的COUNT,结果都是1,永远满足不了>1的HAVING条件,自然查不到数据。
要实现“找出在多台电脑里出现的所有组件条目”,可以用以下两种方法:
方法1:先筛选目标组件,再关联查询
先通过子查询找出所有在多台电脑中出现的组件编号,再关联两张表获取这些组件对应的所有电脑条目:
SELECT cmp.Piece, cpt.NO_COMPUTER FROM Component cmp INNER JOIN Computer cpt ON cmp.Piece = cpt.Piece WHERE cmp.Piece IN ( -- 子查询:找出对应多台电脑的组件 SELECT Piece FROM Computer GROUP BY Piece HAVING COUNT(DISTINCT NO_COMPUTER) > 1 );
方法2:使用窗口函数直接计算
用窗口函数按组件分组,计算每个组件关联的电脑数量,再筛选数量大于1的记录:
SELECT Piece, NO_COMPUTER FROM ( SELECT cmp.Piece, cpt.NO_COMPUTER, -- 按组件分区,计算该组件对应的不同电脑总数 COUNT(DISTINCT cpt.NO_COMPUTER) OVER (PARTITION BY cmp.Piece) AS computer_count FROM Component cmp INNER JOIN Computer cpt ON cmp.Piece = cpt.Piece ) AS sub WHERE computer_count > 1;
这两种方法都能正确返回所有在多台电脑中出现的组件条目,比如你测试的i7 9210对应的两行记录会被正常查出。
内容的提问来源于stack exchange,提问作者JVDev
相关产品推荐
相关产品推荐

