我使用了两个查询:
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
当然,这不起作用。
答案 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)
您需要执行两个步骤:
加入表格
因为您正在使用COUNT聚合函数
在这两个步骤之后,您的查询将如下所示:
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中)。