You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:00:44