首页 > 解决方案 > 如何从一个表中选择另一个表中没有外键的记录

问题描述

我的数据库中有 5 个表 在此处输入图像描述

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

我尝试了类似的东西

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

标签: sqldatabaseh2

解决方案


如果我理解正确,当您遵循表之间的关系时,您希望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
                 );

推荐阅读