所以我总是遇到这种类型的查询问题。我有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表包含我的所有客户,我可以将它们作为连接关联。我正在寻找的是告诉我任何没有相关记录的个人资料。给出的代码向我展示了那些确实有相关记录的代码,我现在想看看那些没有相关记录的人。
感谢。
杰森
答案 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)
);