选择count(*)作为较大选择查询的一部分

时间:2017-10-20 13:37:01

标签: sql-server select join count

我使用了两个查询:

select * from ControlPoints where LineGroup = 123001
select count(*) from BitAssignments where LineGroup = 123001

确定是否需要更新BitAssignments表。我可以以某种方式组合这两个查询吗?

这两个表是从外部源填充的,其思路是1)查看是否缺少ControlPoints的任何成员,以及2)是否存在,以查看是否所有BitAssignments都在表中。

架构如下:

ControlPoints table
   LineGroup     int (primary key)
   Name          string
   NumControls   int
   NumInd        int

BitAssignments table
   LineGroup     int
   BitPosition   int
   Mnemonic      string

对于给定的ControlPoint,ControlPoints表中只有一条记录,但BitAssignments表中可能有数百行的Bit数据。

我需要一个查询,告诉我是否添加(或删除)外部数据中的新控制点,或者是否已从外部数据添加/删除现有控制点的新位分配。另一种方法是从头开始重建这两个表,但这个过程需要12个多小时才能完成(BitAssignments中大约有300,000个记录)。

有些事情:

select a.LineGroup b.select count(Mnemonic) from ControlPoints a, BitAssignments b where a.LineGroup=123001 

当然,这不起作用。

2 个答案:

答案 0 :(得分:0)

您似乎想要一个简单的分组,或者分区计数。

select
    cp.*
    ,count(b.Mnemonic) over (partition by cp.LineGroup or by NumInd)
from
    ControlPoints cp
left join
    BitAssignments b on b.LineGroup = cp.LineGroup 

或PERHAPS ......

select
    cp.*
    ,count(b.Mnemonic) 
from
    ControlPoints cp
left join
    BitAssignments b on b.LineGroup = cp.LineGroup 
group by
    cp.LineGroup
    ,cp.Name
    ,cp.NumControls
    ,cp.NumInd

答案 1 :(得分:0)

您需要执行两个步骤:

  1. 加入表格

  2. 因为您正在使用COUNT聚合函数

  3. ,所以添加GROUP BY子句

    在这两个步骤之后,您的查询将如下所示:

    SELECT cp.LineGroup, cp.Name, cp.NumControls, cp.NumInd, COUNT(ba.Mnemonic) BitAssignmentsCnt
    FROM ControlPoints cp LEFT JOIN BitAssignments ba ON cp.LineGroup=ba.LineGroup
    GROUP BY cp.LineGroup, cp.Name, cp.NumControls, cp.NumInd, ba.LineGroup
    

    如果您想要显示所有ControlPoints,无论他们是否有任何BitAssignments,您都可以使用LEFT JOIN。如果您对BitAssignmentsCnt = 0不感兴趣,可以使用INNER JOIN代替LEFT JOIN。

    GROUP BY需要指定您在查询中使用的所有列(在select或JOIN中)。