Problème avec l'alias dans l'état de jointure

J'ai un problème avec la requête suivante:

SELECT g_contac.contid, g_contac.name, g_contac.email, f_sync.foreign_key, ( SELECT COUNT(g_cpers.cpersid) FROM g_cpers WHERE g_cpers.contid = g_contac.contid ) AS employee_count FROM f_sync FULL OUTER JOIN g_contac ON ( g_contac.contid = f_sync.external_id AND model = case when f_sync.employee_count = 0 then 'PRIVATE' else 'COMPANY' end ) WHERE model = 'COMPANY' or model = 'PRIVATE' OR model IS null 

Quand je l'exécute, j'ai une erreur:

Nom de colonne incorrect 'employee_count'.

Comment résoudre ce problème?

C'est parce que vous mentionnez f_sync.employee_count dans votre requête, mais f_sync n'a pas de colonne appelée employee_count : vous venez de créer une colonne dynamic dans la requête avec l' alias employee_count .

Une solution simple consiste à répéter le calcul:

 SELECT g_contac.contid, g_contac.name, g_contac.email, f_sync.foreign_key, ( SELECT COUNT(g_cpers.cpersid) FROM g_cpers WHERE g_cpers.contid = g_contac.contid ) AS employee_count FROM f_sync FULL OUTER JOIN g_contac ON ( g_contac.contid = f_sync.external_id AND model = case when (SELECT COUNT(g_cpers.cpersid) FROM g_cpers WHERE g_cpers.contid = g_contac.contid) = 0 then 'PRIVATE' else 'COMPANY' end ) WHERE model = 'COMPANY' or model = 'PRIVATE' OR model IS null; 

Une meilleure solution consiste à créer une vue qui inclut cette colonne, ce qui signifie qu'elle ne sera calculée qu'une seule fois.

Modifier: requête améliorée et commentaires incorporés

Vous pouvez améliorer la clarté un peu en utilisant le SQL not exists place de count(*) = 0 :

 SELECT g_contac.contid, g_contac.name, g_contac.email, f_sync.foreign_key FROM f_sync FULL OUTER JOIN g_contac ON ( g_contac.contid = f_sync.external_id AND model = case when not exists (SELECT * FROM g_cpers WHERE g_cpers.contid = g_contac.contid) then 'PRIVATE' else 'COMPANY' end ) WHERE model = 'COMPANY' or model = 'PRIVATE' OR model IS null; 

Pouvez-vous essayer celui-ci:

 SELECT gt.contid, gt.name, gt.email, f_sync.foreign_key, gt.employee_count FROM f_sync FULL OUTER JOIN ( SELECT g_contac.contid, g_contac.name, g_contac.email, ( SELECT COUNT(g_cpers.cpersid) FROM g_cpers WHERE g_cpers.contid = g_contac.contid ) AS employee_count FROM g_contac ) AS gt ON ( gt.contid = f_sync.external_id AND model = case when gt.employee_count = 0 then 'PRIVATE' else 'COMPANY' end )