2017-10-20 1 views
0

Ich bin mit zwei Abfragen:select count (*) als Teil größeren Auswahlabfrage

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

, um zu bestimmen, ob ich die BitAssignments Tabelle zu aktualisieren. Kann ich diese beiden Abfragen irgendwie kombinieren?

Diese beiden Tabellen werden aus einer externen Quelle befüllt, und die Idee ist 1) zu sehen, wenn Mitglieder von ControlPoints fehlen, und 2) wenn sie vorhanden sind, um zu sehen, ob alle BitAssignments in der Tabelle sind.

Schema ist wie folgt:

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

BitAssignments table 
    LineGroup  int 
    BitPosition int 
    Mnemonic  string 

Für eine gegebene Controlpoint wird es nur ein Datensatz in der Tabelle Kontrollpunkt, aber es kann Hunderte von Zeilen von Bit-Daten in der BitAssignments Tabelle sein.

Ich brauche eine Abfrage, die mir sagt, ob neue Kontrollpunkte in den externen Daten hinzugefügt (oder gelöscht) wurden, oder ob neue Bit-Zuordnungen zu einem vorhandenen Kontrollpunkt hinzugefügt/entfernt wurden von externen Daten. Die Alternative besteht darin, beide Tabellen von Grund auf neu zu erstellen, aber dieser Vorgang dauert mehr als 12 Stunden (ca. 300.000 Datensätze in BitAssignments).

Etwas entlang der Linien von:

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

was natürlich, funktioniert nicht.

Antwort

0

Sie müssen zwei Schritte tun:

  1. Tabellen JOIN

  2. Add GROUP BY-Klausel, da Sie verwenden COUNT-Aggregationsfunktion

Nach diesen 2 Schritten Ihre Abfrage würde wie folgt aussehen:

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 

würden Sie LEFT JOIN verwenden, wenn Sie alle Kontrollpunkte unabhängig davon angezeigt werden möchte, ob sie irgendwelche BitAssignments haben oder nicht. Wenn Sie nicht an BitAssignmentsCnt = 0 interessiert sind, können Sie statt LEFT JOIN INNER JOIN verwenden.

GROUP BY muss alle Spalten angeben, die Sie in der Abfrage verwenden (entweder in select oder in JOIN).

+0

Absolut perfekt gearbeitet; Danke! – user3235770

0

Es scheint, als ob Sie eine einfache Gruppe mit oder eine Zählung mit einer Partition wünschen.

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 

oder vielleicht ...

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