2017-09-20 1 views
1

SQL Server peut-il renvoyer aucun enregistrement si un agrégat de groupe aboutit à zéro enregistrement au lieu d'un enregistrement unique avec des valeurs nulles et 0?La requête SQL Server renvoie-t-elle des enregistrements zéro à la place d'un seul enregistrement null pour un groupe non agrégé?

L'instruction SQL problème:

select 
    Max(InterfaceID), Count(*) 
from 
    (select InterfaceID 
    from interface 
    where interfaceid = 99) as Interfaces 

résultat Problème

+-------+---------+ 
| i_max | i_count | 
+-------+---------+ 
| NULL |  0 | 
+-------+---------+ 

Exemple si un groupe par spécifié

select 
    Max(InterfaceID), Count(*) 
from 
    (select InterfaceID 
    from interface 
    where interfaceid = 99) as Interfaces 
group by 
    interfaceid 

Résultat:

+-------+---------+ 
| i_max | i_count | 
+-------+---------+ 

Pouvez-vous obtenir le deuxième résultat avec la première requête, pas de groupe par spécifié?

Tout cela parce que le modèle Entity Framework et la gestion des données vide le tableau au lieu d'un enregistrement de tableau 1, mais de peu d'utilité.

+1

Ajouter une clause having. Comme HAVING MAX (InterfaceID)> 0 ou quelque chose du genre, tout ce qui fonctionne pour vos données réelles. –

+0

Les requêtes que vous avez passées ont des clauses GROUP BY et renvoient zéro ligne. Je suppose que vous vouliez omettre le GROUP BY dans la première requête, auquel cas il résume la sous-requête, et une seule ligne avec (null, 0) est le résultat correct. Pouvez-vous élaborer sur le problème d'EF auquel vous faites face? –

+0

merci - supprimé GROUP BY sur la première requête. – Maze

Répondre

2

vous pouvez vous modifier une requête comme -

select Max(InterfaceID), Count(*) 
from (
    select InterfaceID from interface where interfaceid=99 
) as Interfaces 
having Max(InterfaceID) is not null 
+0

génial, cela fonctionne. – Maze

0

Comme alternative à HAVING vous pouvez également ajouter GROUP BY() - le ci-dessous retournerez 0 lignes s'il n'y avait pas de lignes correspondant à l'entrée, ou un seul résultat de la ligne agréger toutes les lignes dans l'entrée sinon.

SELECT MAX(InterfaceID), 
     COUNT(*) 
FROM  (SELECT InterfaceID 
       FROM interface 
       WHERE interfaceid = 99) AS Interfaces 
GROUP BY()