使用SQL从计数中排除值

使用SQL从计数中排除值,sql,subquery,Sql,Subquery,我准备了两张临时桌。表A由成员及其管理的业务组成,多个成员可以关联到单个业务。表B仅包括成员、他们的ID以及他们的业务关系类别零售、业务或零售和业务 我需要提出的查询是找出表B中哪些成员根本没有零售关系。不幸的是,一个简单的where子句是不够的,因为一个成员可能有多个关系,即John Doe有零售和业务关系,或者可能三者都有 我可以尝试从B中选择*WHERE class='Business',这将吸引列中列出的所有有业务关系的成员,但另一方面,当我说WHERE class='Retail',它

我准备了两张临时桌。表A由成员及其管理的业务组成,多个成员可以关联到单个业务。表B仅包括成员、他们的ID以及他们的业务关系类别零售、业务或零售和业务

我需要提出的查询是找出表B中哪些成员根本没有零售关系。不幸的是,一个简单的where子句是不够的,因为一个成员可能有多个关系,即John Doe有零售和业务关系,或者可能三者都有


我可以尝试从B中选择*WHERE class='Business',这将吸引列中列出的所有有业务关系的成员,但另一方面,当我说WHERE class='Retail',它将吸引所有有业务关系的成员。我想从我的统计中排除任何没有零售关系的人,因此从我上面的示例中,John Doe将不包括在内。

表B中的零售关系从零售开始。。。因此,我们可以使用类似“Retail%”的方式选择这些成员,然后使用NOT IN将它们从表A中选择的成员中排除


我没有任何测试数据,但请尝试一下

Select
    ta.*
From seequillTableA as ta
Left Join   
    (Select
        ID
        , COUNT(*) as cntRetail
    From seequillTableB
    Where Class <> 'Retail' AND Class <> 'Retail and Business'
    Group By ID
    Having COUNT(*) = 0
    ) as tb
On ta.ID = tb.ID
Where tb.cntRetail = 0

我更喜欢克里斯的解决方案,汉克斯!看到解决这个问题的另一种方法总是很有趣的。这就是SQL的问题所在。谢谢,Chris,查询看起来很棒,但是当我运行查询时,我没有得到任何结果。这意味着桌子上真的没有人没有零售关系吗?@seequill也许没有?尝试计数那些具有零售关系的成员,排除NOT:SELECT COUNTDISTINCT MemberID FROM TableB WHERE MemberID IN SELECT MemberID FROM TableB WHERE类,如“retail%”,并将其与您拥有的唯一MemberID数量进行比较:SELECT COUNTDISTINCT MemberID FROM TableB。如果它们相同,则每个人都有零售关系。或者,从成员中删除零售关系,重新运行查询,看看该成员现在是否出现(假设您有一个测试数据库可供使用)-不要在实时生产数据库中执行此操作。几句话来解释SQL代码可能会对后代有所帮助,并对那些不熟悉LIKE/子查询的人有所帮助。是的,所有成员的不同计数产生的数量与零售关系成员的计数相同。我想我的逻辑有些混乱,因为我的经理提到有些情况并非如此。我将从临时表中的一个成员中删除零售关系,并查看该查询是否会将他拉上来。
Select
    ta.*
From seequillTableA as ta
Left Join   
    (Select
        ID
        , COUNT(*) as cntRetail
    From seequillTableB
    Where Class <> 'Retail' AND Class <> 'Retail and Business'
    Group By ID
    Having COUNT(*) = 0
    ) as tb
On ta.ID = tb.ID
Where tb.cntRetail = 0