SQL多表查询中如何选取同一属性的两个值?技术求助
嘿,这个问题其实有几种靠谱的解法,我来给你拆解下——子查询当然是可行的方案之一,不过还有其他更直观的实现方式,咱们一个个说清楚:
方法1:子查询(直接回应你的疑问)
这个思路非常直接:先找出所有供应红色零件的供应商SID,再筛选出同时供应绿色零件的供应商,取两者的交集就行。代码如下:
SELECT c1.sid AS SID, 'green' AS Color1, 'red' AS Color2 FROM catalog c1 JOIN parts p1 ON c1.pid = p1.pid WHERE p1.color = 'green' AND c1.sid IN ( SELECT c2.sid FROM catalog c2 JOIN parts p2 ON c2.pid = p2.pid WHERE p2.color = 'red' );
简单解释下:内层的子查询先锁定所有供应红色零件的供应商ID,外层查询则筛选出供应绿色零件的供应商,并且要求这些ID出现在子查询的结果里——这样就精准得到了同时供应两种颜色零件的供应商。至于你要的Color1和Color2列,因为是固定的绿色和红色,直接在SELECT里指定常量值就可以啦。
方法2:分组聚合(更简洁的写法)
如果不想用子查询,用分组加条件判断的方式也能轻松实现:
SELECT c.sid AS SID, 'green' AS Color1, 'red' AS Color2 FROM catalog c JOIN parts p ON c.pid = p.pid WHERE p.color IN ('green', 'red') GROUP BY c.sid HAVING COUNT(DISTINCT p.color) = 2;
这个逻辑是:先筛选出所有涉及绿色或红色零件的记录,然后按供应商ID分组,最后用HAVING COUNT(DISTINCT p.color) = 2来确保这个供应商的记录里同时包含两种颜色的零件——毕竟如果只供应其中一种,计数只会是1,这样就过滤掉了不符合要求的供应商。
方法3:自连接(另一种清晰的思路)
通过将表自连接,匹配同一个供应商下的两种颜色零件记录,也能达到目的:
SELECT DISTINCT c1.sid AS SID, 'green' AS Color1, 'red' AS Color2 FROM catalog c1 JOIN parts p1 ON c1.pid = p1.pid JOIN catalog c2 ON c1.sid = c2.sid JOIN parts p2 ON c2.pid = p2.pid WHERE p1.color = 'green' AND p2.color = 'red';
这里的逻辑是:把同一个供应商的绿色零件记录和红色零件记录做连接,这样能直接得到同时拥有两种零件的供应商ID。加上DISTINCT是为了避免同一个供应商有多个同色零件时出现重复结果。
总结一下:你困惑的“选取color属性的两个值”,其实不需要复杂地拆分color列,因为输出里的颜色是固定的绿色和红色,直接在SELECT语句里指定常量值就能匹配你要的输出格式啦。
内容的提问来源于stack exchange,提问作者Sheriff_Joe
相关产品推荐
相关产品推荐

