首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询%1中不存在记录的多个表

问SQL查询%1中不存在记录的多个表
EN

Stack Overflow用户
提问于 2017-09-19 04:29:36
回答 3查看 66关注 0票数 0

因此,我在处理这种类型的查询时总是遇到问题。我有2个表,我需要将它们组合为3个表,但我需要查询来查看一个连接中是否不存在记录。

设计是这样的:表1连接到表2,查找现有记录。然后,表1需要使用不同的记录id再次连接到表2,但查找不存在。

我当前的代码如下所示:

代码语言:javascript
复制
select p.ProfileId, p.OrgInd, p.OrgName, p1.OrgInd, p1.ProfileId
from profile as p inner join
ProfileRelations as pa on p.ProfileId = pa.ProfileID inner join
profile as p1 on p1.ProfileId = pa.RelProfileID

我需要profile(p)来连接到PRofileRelations(pa),但随后我需要将ProfileRelations(pa)连接回Profile(p1)上,其中p1.profileid不存在于ProfileRelations(pa)中,具体查看列RelProfileID。

这是一个用于查看相关记录的关联表。Profile表保存了我的所有客户,我可以将他们作为连接进行关联。我要找的是向我展示任何没有相关记录的个人资料。给出的代码显示了那些有相关记录的人,我现在只想看到那些没有相关记录的人。

谢谢。

杰森

EN

回答 3

Stack Overflow用户

发布于 2017-09-19 04:44:37

Joins的可视化理解:https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

使用左连接:

没有相关关系的所有配置文件。在这种情况下,我们连接这些表,但我们知道p1和pa的值将为空,因为左连接将包括所有配置文件,并且只保留关系表中具有相关记录的配置文件。

代码语言:javascript
复制
SELECT p.ProfileId, p.OrgInd, p.OrgName, p1.OrgInd, p1.ProfileId
FROM profile as p 
LEFT join ProfileRelations as pa 
   on p.ProfileId = pa.ProfileID 
LEFT join profile as p1 
  on p1.ProfileId = pa.RelProfileID
WHERE PA.ProfileID is null

在上面的P1中,由于where子句的原因,值将始终为null。

OR使用not exists and相关子查询

所有配置文件都没有相关的配置文件关系。因为我们知道没有关系,所以我们不需要来自其他表的数据;因此,我们可以从select中排除它们,从而简化查询并提高性能。

代码语言:javascript
复制
SELECT p.ProfileId, p.OrgInd, p.OrgName
FROM profile as p 
WHERE NOT EXISTS (SELECT * 
                  FROM ProfileRelations as pa 
                  WHERE p.ProfileId = pa.ProfileID) 

在这种情况下,我们根本不选择P1表,因为没有关系记录。

票数 1
EN

Stack Overflow用户

发布于 2017-09-19 04:45:36

首先:您想要选择配置文件。因此,请执行此操作;从配置文件表中进行选择。您希望应用条件(缺少关系);因此将其放入WHERE子句中。条件属于WHERE子句。没有必要加入。

所有没有相关配置文件的配置文件:

代码语言:javascript
复制
select *
from profile
where ProfileId not in (select ProfileID from ProfileRelations)
  and ProfileId not in (select RelProfileID from ProfileRelations);

或

代码语言:javascript
复制
select *
from profile p
where not exists
(
  select *
  from ProfileRelations pr
  where p.ProfileId in (pr.ProfileId, pr.RelProfileID)
);

所有不相关的配置文件对:

代码语言:javascript
复制
select *
from profile p1
join profile p2 on p2.ProfileID <> p1.ProfileID
where not exists
(
  select *
  from ProfileRelations pr
  where (pr.ProfileId = p1.ProfileId and pr.RelProfileID = p2.ProfileId)
     or (pr.ProfileId = p2.ProfileId and pr.RelProfileID = p1.ProfileId)
);
票数 1
EN

Stack Overflow用户

发布于 2017-09-19 04:37:36

根据您的问题陈述,请尝试以下操作:

代码语言:javascript
复制
select p.ProfileId, p.OrgInd, p.OrgName, p1.OrgInd, p1.ProfileId
from profile as p 
        inner join
     ProfileRelations as pa 
        on p.ProfileId = pa.ProfileID 
where pa.RelProfileID not in (select ProfileId from profile);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46287714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档