Directement du manuel :
La liste des expressions de sortie après
SELECT
peut être vide, produisant une table de résultats sans colonne. Ce n'est pas une syntaxe valide selon la norme SQL. PostgreSQL lui permet d'être cohérent avec l'autorisation des tables sans colonne. Cependant, une liste vide n'est pas autorisée lorsqueDISTINCT
est utilisé.
La possibilité de tables "zéro colonne" est un effet secondaire de l'héritage de table si je ne me trompe pas. Il y a eu des discussions à ce sujet sur les listes de diffusion Postgres (mais je ne les trouve pas pour le moment)