因此,我在处理这种类型的查询时总是遇到问题。我有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我需要profile(p)来连接到PRofileRelations(pa),但随后我需要将ProfileRelations(pa)连接回Profile(p1)上,其中p1.profileid不存在于ProfileRelations(pa)中,具体查看列RelProfileID。
这是一个用于查看相关记录的关联表。Profile表保存了我的所有客户,我可以将他们作为连接进行关联。我要找的是向我展示任何没有相关记录的个人资料。给出的代码显示了那些有相关记录的人,我现在只想看到那些没有相关记录的人。
谢谢。
杰森
发布于 2017-09-19 04:44:37
Joins的可视化理解:https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
使用左连接:
没有相关关系的所有配置文件。在这种情况下,我们连接这些表,但我们知道p1和pa的值将为空,因为左连接将包括所有配置文件,并且只保留关系表中具有相关记录的配置文件。
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中排除它们,从而简化查询并提高性能。
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表,因为没有关系记录。
发布于 2017-09-19 04:45:36
首先:您想要选择配置文件。因此,请执行此操作;从配置文件表中进行选择。您希望应用条件(缺少关系);因此将其放入WHERE子句中。条件属于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)
);发布于 2017-09-19 04:37:36
根据您的问题陈述,请尝试以下操作:
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);https://stackoverflow.com/questions/46287714
复制相似问题