如何获取未与其他表建立外键关联的父表ID
解决方法:获取未关联外键的父表ID
首先,咱们先明确你的核心需求:要找**本身是父表(包含主键字段)且没有外键字段(即不与其他表建立外键关联)**的表ID,预期结果是1。
你现有SQL的问题
你尝试的两个SQL方向完全反了——它们都是在查询存在外键字段的表ID,所以得到的是2和3,自然不符合预期:
SELECT DISTINCT table_id FROM tables_structure WHERE fk!='':直接筛选出有外键字段的表SELECT table_id FROM tables_structure WHERE fk!='' GROUP BY table_id HAVING fk!='':本质和第一个SQL一致,只是多了分组操作,结果还是带外键的表
正确的SQL写法
这里提供两种清晰可行的写法,都能得到你要的结果1:
方法1:用NOT EXISTS子查询(逻辑更直观)
先筛选出所有父表(有主键字段的表),再排除那些自身存在外键字段的表:
SELECT DISTINCT ts.table_id FROM tables_structure ts WHERE ts.PK = 'pk' AND NOT EXISTS ( SELECT 1 FROM tables_structure ts2 WHERE ts2.table_id = ts.table_id AND ts2.FK = 'fk' )
方法2:用GROUP BY + HAVING(聚合筛选)
通过分组聚合,一次性判断每个表是否是父表,且没有外键字段:
SELECT table_id FROM tables_structure GROUP BY table_id HAVING MAX(PK) = 'pk' -- 确保该表是父表(包含主键字段) AND MAX(FK) IS NULL -- 确保该表没有任何外键字段
逻辑说明
- 父表定义:我们默认包含
PK='pk'记录的表是父表(这类表通常有主键供其他表关联) - 筛选逻辑:从父表中剔除有
FK='fk'记录的表,剩下的就是没有外键关联的父表,也就是你要的1
内容的提问来源于stack exchange,提问作者TAHER El Mehdi
相关产品推荐
相关产品推荐

