SQL查询多个表,其中记录不存在于1中

时间:2017-09-18 20:29:36

标签: mysql sql sql-server

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

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

我目前的代码如下:

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

我需要配置文件(p)连接到PRofileRelations(pa),但是我需要将ProfileRelations(pa)连接到Profile(p1),其中p1.profileid在ProfileRelations(pa)中不存在,专门查看列RelProfileID。

这是一个查看相关记录的关联表。 Profile表包含我的所有客户,我可以将它们作为连接关联。我正在寻找的是告诉我任何没有相关记录的个人资料。给出的代码向我展示了那些确实有相关记录的代码,我现在想看看那些没有相关记录的人。

感谢。

杰森

3 个答案:

答案 0 :(得分:0)

根据您的问题陈述,请尝试:

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);

答案 1 :(得分:0)

对联接的视觉理解:https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

使用左连接:

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

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子句,它总是为空。

OR使用不存在且相关的子查询

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

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表,因为没有关系记录。

答案 2 :(得分:0)

首先:您想要选择个人资料。这样做;从配置文件表中选择。你想申请标准(缺少关系);所以把它放在WHERE子句中。 Criteria属于WHERE子句。没有必要加入。

所有没有相关个人资料的个人资料:

select *
from profile
where ProfileId not in (select ProfileID from ProfileRelations)
  and ProfileId not in (select RelProfileID from ProfileRelations);

select *
from profile p
where not exists
(
  select *
  from ProfileRelations pr
  where p.ProfileId in (pr.ProfileId, pr.RelProfileID)
);

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

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)
);