2017-10-20 32 views
0

的一部分,我用两个查询:SELECT 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 

对于给定的控制点,将有只有一个控制点表记录,但可能有数百个在BitAssignments表位的数据行。

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

线沿线的东西:

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

其中,当然,不能正常工作。

回答

0

你需要做2步:

  1. JOIN表

  2. 添加GROUP BY子句,因为你正在使用COUNT汇总功能

那些2步骤后您的查询应该是这样的:

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 

你会使用LEFT JOIN如果你想显示所有控制点,无论他们是否有任何BitAssignments与否。如果您对BitAssignmentsCnt = 0不感兴趣,则可以使用INNER JOIN而不是LEFT JOIN。

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

+0

绝对完美地工作;谢谢! – user3235770

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 

或许...

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