SQL:没有子查询但只有联接

时间:2017-07-05 13:35:05

标签: 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 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'

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:1)

您发布的查询非常不同。一个是包容性的(其中SC.NUMBER_C IN .... - 另一个是独占的(左外连接,其中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'

编辑:

您需要使用子查询和NOT 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'
    )

答案 1 :(得分:0)

select count(SC.NUMBER_C) 
from FNQP2PORTAL.SA.SEC_CAS SC
INNER JOIN FNQP2HQ.dbo.Entities E on SC.NUMBER_C = E.Reference
INNER JOIN FNQP2HQ.dbo.Classes C on C.ID = E.ClassID 
where C.Reference =  'Assembly case'

答案 2 :(得分:0)

尝试下面的代码,它可能会抛出错误,因为您还没有与我们共享示例数据。但是你应该使用exists子句。

if (buffer[i] <'A')
 { 
buffer[i] = (char)(buffer[i] + 26);
 }

答案 3 :(得分:0)

人们使用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