2017-10-20 39 views
0

plus select J'utilise deux requêtes:select count (*) dans le cadre de la requête

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

pour déterminer si je dois mettre à jour la table BitAssignments. Puis-je combiner ces deux requêtes en quelque sorte?

Ces deux tables sont peuplées à partir d'une source externe, et l'idée est 1) pour voir si des membres de ControlPoints sont manquants, et 2) s'ils sont présents, pour voir si tous les BitAssignments sont dans la table.

schéma sont les suivantes:

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

BitAssignments table 
    LineGroup  int 
    BitPosition int 
    Mnemonic  string 

Pour un ControlPoint donné, il n'y aura qu'un seul enregistrement de la table des points de contrôle, mais il peut y avoir des centaines de lignes de données de bits dans la table BitAssignments.

J'ai besoin d'une requête qui m'indique si de nouveaux points de contrôle dans les données externes ont été ajoutés (ou supprimés) ou si de nouvelles affectations de bits à un point de contrôle existant ont été ajoutées/retirées des données externes. L'alternative consiste à reconstruire les deux tables à partir de zéro, mais ce processus prend plus de 12 heures (environ 300 000 enregistrements dans BitAssignments).

Quelque chose le long des lignes de:

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

qui, bien sûr, ne fonctionne pas.

Répondre

0

Vous devez faire 2 étapes:

  1. tables

    Inscrivez-
  2. Ajouter clause GROUP BY puisque vous utilisez COUNT fonction d'agrégation

Après les deux étapes de votre requête ressemblerait à ceci:

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 

Vous utiliseriez LEFT JOIN si vous voulez afficher tous les points de contrôle, peu importe s'ils ont des BitAssignments ou non. Si vous n'êtes pas intéressé par BitAssignmentsCnt = 0, vous pouvez utiliser INNER JOIN au lieu de LEFT JOIN.

GROUP BY doit spécifier toutes les colonnes que vous utilisez dans la requête (dans select ou dans JOIN).

+0

Absolument travaillé parfaitement; Je vous remercie! – user3235770

0

Il semble que vous souhaitiez un groupe simple ou un compte avec une partition.

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 

OU ... PEUT-ÊTRE

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