2017-10-20 15 views
1

Référez-requête suivante:requête T-SQL avec des agrégats de retour d'un jeu de résultats non vide lorsque le prédicat est faux

SELECT SUM(n) AS SUMVAL FROM (values(3),(4)) AS tbl(n) WHERE 1=0

Depuis que je suis fournirai un prédicat qui est faux, je l'aurais pris pour retourner une jeu de résultats vide (0 lignes). Mais il renvoie une ligne avec NULL. Est-ce un bug? Ou existe-t-il une explication valable pour ce comportement?

Si je supprime la fonction d'agrégation, je reçois un jeu de résultats vide comme prévu:

SELECT n AS VAL FROM (values(3),(4)) AS tbl(n) WHERE 1=0 

Et juste pour préciser, si je retire le faux prédicat, la requête retourne 2 lignes avec des valeurs 3 et 4 pour la colonne 'VAL'

SELECT n AS VAL FROM (values(3),(4)) AS tbl(n) 

Mais si j'utilise des fonctions d'agrégation avec clause GROUP BY, comme indiqué dans la requête ci-dessous, je me résultat escompté (vide rowset)

SELECT id, SUM(n) AS SUMVAL FROM (values(1,3.0),(2,4.0)) AS tbl(id,n) WHERE 1=0 GROUP BY id 

Répondre

-1

SELECT SUM (n) AS SUMVAL à partir de (valeurs (3), (4)) AS tbl (n) OU 1 = 0

Comme dans le cas ci-dessus en sélectionnant uniquement les déclarations de valeur agrégée NULL lorsque le prédicat est faux car nous n'avons aucune ligne répondant à la condition de prédicat.

id SELECT, SUM (n) à partir de AS SUMVAL (valeurs (1,3.0), (2,4.0)) AS tbl (id, n) 1 = 0 GROUP BY id

Mais dans ce qui précède, il retourne un ensemble de résultats vide parce que nous essayons de résumer les valeurs en fonction d'un élément spécifique qui n'existe même pas (dans votre exemple faux prédicat). Ceci est le comportement normal du serveur SQL.