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