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

PostgreSQL如何查询与指定乐队存在1度分离关联的其他乐队ID

方法1:IN子查询拼接逻辑

直接将查询Foo成员ID的语句作为子查询嵌入过滤条件即可:

SELECT DISTINCT b.id, b.name 
FROM bands AS b
INNER JOIN band_membership AS bm ON b.id = bm.band_id
WHERE bm.musician_id IN (
    SELECT m.id 
    FROM musicians AS m
    INNER JOIN band_membership AS bm ON m.id = bm.musician_id
    WHERE bm.band_id = (SELECT id FROM bands WHERE name = 'Foo')
)
AND b.name != 'Foo' -- 排除原乐队Foo本身
ORDER BY b.id;

这里用DISTINCT实现结果去重,如果你习惯用GROUP BY也可以替换为GROUP BY b.id, b.name,效果一致。

方法2:全JOIN实现(性能更优)

如果数据量较大,全程用关联查询的执行效率更高,不需要嵌套子查询:

SELECT DISTINCT b_related.id, b_related.name
FROM bands b_foo
-- 关联Foo对应的成员映射
INNER JOIN band_membership bm_foo ON b_foo.id = bm_foo.band_id
-- 关联Foo的所有成员
INNER JOIN musicians m ON bm_foo.musician_id = m.id
-- 关联这些成员加入的所有乐队映射
INNER JOIN band_membership bm_related ON m.id = bm_related.musician_id
-- 关联得到关联乐队的信息
INNER JOIN bands b_related ON bm_related.band_id = b_related.id
WHERE b_foo.name = 'Foo'
AND b_related.name != 'Foo'
ORDER BY b_related.id;

两种方案都可以得到你预期的Bar、Rab两个乐队的查询结果。

内容的提问来源于stack exchange,提问作者tschlafer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:36:04