如何从一个表中选择另一个表中没有外键的记录

Posted

技术标签:

【中文标题】如何从一个表中选择另一个表中没有外键的记录【英文标题】:How to select records from a table which do not have foreign key in another table 【发布时间】:2020-06-06 14:50:30 【问题描述】:

我的数据库中有 5 个表

我想选择V 中的V_CODE,当F_CODE = 'A' 时,哪些记录不与F 共享任何 S 外键。

我尝试了类似的东西

select distinct V_CODE
from V
         inner join V_S VS on V.V_ID = VS.V_FK
         inner join S on VS.S_FK = S.S_ID
where S._ID not in (
    select FS.S_FK
    from F
             inner join F_S on F.F_ID = F_S.F_FK
    where F.F_CODE = 'A'
    );

但这并不能完全返回我想要的。 有人可以帮忙吗?提前致谢。

表 F

| F_ID |  F_CODE |
| 1    |    A    |
| 2    |    B    |
| 3    |    C    |

表 F_S

| F_FK |  S_FK  |
| 1    |    1   |
| 2    |    2   |
| 3    |    3   |

表 S

| S_ID |  S_CODE  |
| 1    |    S1    |
| 2    |    S2    |
| 3    |    S3    |

表 V_S

| V_FK |  S_FK  |
| 1    |    1   |
| 1    |    2   |
| 2    |    3   |
| 3    |    1   |
| 3    |    3   |

表五

| V_ID |  V_CODE  |
| 1    |    V1    |
| 2    |    V2    |
| 3    |    V3    |

在这种情况下,我只想返回 V2,因为当 F_CODE = 'A' 时,它是表 V 中唯一不共享表 S 中的记录的记录

【问题讨论】:

样本数据和期望的结果真的很有帮助。 【参考方案1】:

如果我理解正确,当您遵循表之间的关系时,您希望v_codes 没有f_code = 'A'

对我来说,这表明not exists

select v.*
from v
where not exists (select 1
                  from v_s join
                       f_s
                       on v_s.s_fk = f_s.s_fk join
                       f
                       on f_s.f_fk = f.f_id
                  where f.f_code = 'A' and vs.v_fk = v.v_id
                 );

【讨论】:

这对我不起作用。它返回空。我在内存中使用 h2,我不知道这是否相关 @znaya 。 . .有错误吗?这是标准 SQL,所以它应该可以工作。 不,只是一个空结果...无论如何,受您的建议的启发,我适应选择 V_ID NOT IN V_S join F_S join F where F_CODE = 'A'。我仍在运行一些测试,以确保它真的做到了它的意思 @znaya 。 . .我确定了答案。我省略了外部查询的相关子句。这应该比not in 更快。 刚刚记得我没有给你反馈,对不起。它工作得很好。非常感谢您的帮助

以上是关于如何从一个表中选择另一个表中没有外键的记录的主要内容,如果未能解决你的问题,请参考以下文章

MS Access:从没有外键的 2 个表中选择记录

从具有 2 个外键的 2 个表中选择

当我从具有其他外键的表中删除一个条目时,相应的记录也不会被删除

主键和外键的作用

sql主键和外键的区别

可以使用实体框架在另一个表中调用两次作为外键的主键吗?