Sql server SQL:没有子查询,只有联接
我试图找到一个替代此查询的方法,其中不存在子选择,但只连接左、右、内等Sql server SQL:没有子查询,只有联接,sql-server,left-join,inner-join,Sql Server,Left Join,Inner Join,我试图找到一个替代此查询的方法,其中不存在子选择,但只连接左、右、内等 select count(SC.NUMBER_C) from FNQP2PORTAL.SA.SEC_CAS SC where SC.NUMBER_C not in ( select E.Reference from FNQP2HQ.dbo.Entities E join FNQP2HQ.dbo.Classes C on C.ID = E.ClassID where C.Reference = 'Assembly ca
select count(SC.NUMBER_C)
from FNQP2PORTAL.SA.SEC_CAS SC
where SC.NUMBER_C not in (
select E.Reference from
FNQP2HQ.dbo.Entities E
join FNQP2HQ.dbo.Classes C on C.ID = E.ClassID
where C.Reference = 'Assembly case')
所以,它应该是像
select count(SC.NUMBER_C)
from FNQP2PORTAL.SA.SEC_CAS SC
left join FNQP2HQ.dbo.Entities E on E.Reference = SC.NUMBER_C and E.Reference IS NULL
inner join FNQP2HQ.dbo.Classes C on C.ID = E.ClassID and C.Reference = 'Assembly case'
有人能帮我吗?你发布的查询非常不同。其中一个包括在……中的SC.NUMBER_C——另一个是独占的左外连接,其中E.Reference为NULL。由于这些完全不同的查询,不清楚您试图做什么 这就是使用联接而不是子查询来完成第一个查询的方法
SELECT COUNT(SC.NUMBER_C)
FROM FNQP2PORTAL.SA.SEC_CAS SC
JOIN FNQP2HQ.dbo.Entities E
ON SC.NUMBER_C = E.Reference
JOIN FNQP2HQ.dbo.Classes C
ON C.ID = E.ClassID
WHERE C.Reference = 'Assembly Case'
编辑:
您需要使用子查询,而不是IN来获取您在评论中要求的内容。不能只使用连接
SELECT COUNT(SC.NUMBER_C)
FROM FNQP2PORTAL.SA.SEC_CAS SC
WHERE SC.NUMBER_C NOT IN
(
SELECT E.Reference
FROM FNQP2HQ.dbo.Entities E
JOIN FNQP2HQ.dbo.Classes C
ON C.ID = E.ClassID
WHERE C.Reference = 'Assembly Case'
)
请尝试下面的代码,它可能会引发错误,因为您尚未与我们共享示例数据。但您应该使用exists子句
SELECT COUNT(SC.NUMBER_C)
FROM FNQP2PORTAL.SA.SEC_CAS SC,
FNQP2HQ.dbo.Classes C,
FNQP2HQ.dbo.Entities E
WHERE C.ID = E.ClassID
AND C.Reference = 'Assembly Case'
and not exists(
select 1 from FNQP2HQ.dbo.Entities E1
ON SC.NUMBER_C = E1.Reference)
人们使用WHERE-IN逻辑的一个原因是通过join返回重复项。因此,在这种情况下,将逻辑移动到内部联接可能导致计数膨胀。以下是您将如何解决此问题:
select count(SC.NUMBER_C)
from FNQP2PORTAL.SA.SEC_CAS SC
inner join
(
select distinct E.Reference
from FNQP2HQ.dbo.Entities E
join FNQP2HQ.dbo.Classes C on C.ID = E.ClassID
where C.Reference = 'Assembly case'
) as b
on b.reference = sc.NUMBER_C
为什么有E。作为左联接的一部分,引用为空?我想要SC中不存在于E中的所有内容。这将给我SC中也存在于E中的所有内容。我想要SC中不存在于E中的所有内容。您的答案与我的原始查询完全相同。谢谢您的反馈。@RicoStrydom不,不是-您在中使用,我在中使用。你运行查询了吗?这是不同的,应该是你需要的。请让我知道它是否需要修改,我会尽力帮助。我刚才注意到我粘贴了错误的查询。我本该过去的问题没有答案。我更新了原来的帖子。如果引起混乱,我深表歉意。@RicoStrydom完全没有问题-谢谢你的澄清。不能只使用联接的原因是,您试图将外部联接保留到表,只需要空值,然后需要从该表执行内部联接。这不能完全通过连接来实现,因此需要一个子查询。不过,我希望一些SQL专家能提供一种更巧妙的方法,所以我会查看这篇文章。为什么你会发布与我已经提供的答案完全相同的答案?我们同时发布。这个查询不起作用。当E未定义时,您正在加入C.ID=E.ClassID上的类。
select count(SC.NUMBER_C)
from FNQP2PORTAL.SA.SEC_CAS SC
inner join
(
select distinct E.Reference
from FNQP2HQ.dbo.Entities E
join FNQP2HQ.dbo.Classes C on C.ID = E.ClassID
where C.Reference = 'Assembly case'
) as b
on b.reference = sc.NUMBER_C