problème de groupe par clause

J'ai écrit une requête dans l'access et maintenant j'essaye d'écrire la même chose dans SQL Server j'obtiens l'erreur suivante:

Msg 164, niveau 15, état 1, procédure OQRY_STEP_1_1, ligne 15 Chaque expression GROUP BY doit contenir au less une colonne qui n'est pas une reference externe.

Ma requête SQL est la suivante:

SELECT ns11.SYS_ID, ns11.SUB_NET_ID, ns11.TEMP_ID, ns11.EQ_ID, ns11.NODE_NAME, ns11.EQ_NAME, ns11.VAR_NAME, ns11.VAR_SET, ns11.VAR_SUBSET, ns11.EQ_TYPE, ns11.RHS_RELN, ns11.RHS_OBJECT, ns11.EQ_TP_OFFSET, ns11.RHS_TP_OFFSET, ns11.RETAIN, nmte.RHS_VAR_SET, nmte.RHS_VAR_SUBSET, nmte.RHS_VAR_NAME, 0 AS RHS_VAR_TYPE, CASE WHEN [asp].[VALUE] = NULL THEN 0 ELSE [asp].[VALUE] END RHS_VALUE INTO ##OT_STEP_1_1 FROM (##NT_STEP_1_1 ns11 INNER JOIN ##NT_MASTER_TEMP_EQUATION nmte ON (ns11.SYS_ID = nmte.SYS_ID) (ns11.SUB_NET_ID = nmte.SUB_NET_ID) AND (ns11.TEMP_ID = nmte.TEMP_ID) AND (ns11.EQ_ID = nmte.EQ_ID) AND (ns11.NODE_NAME = nmte.NODE_NAME) AND (nmte.SYS_ID = ns11.SYS_ID) AND (nmte.SUB_NET_ID = ns11.SUB_NET_ID)) LEFT JOIN AMST_SIM_PAR asp ON (nmte.SYS_ID = asp.SYS_ID) AND (nmte.SUB_NET_ID = ns11.SUB_NET_ID) AND (nmte.RHS_VAR_NAME = asp.VAR_NAME) GROUP BY ns11.SYS_ID, ns11.SUB_NET_ID, ns11.TEMP_ID, ns11.EQ_ID, ns11.NODE_NAME, ns11.EQ_NAME, ns11.VAR_NAME, ns11.VAR_SET, ns11.VAR_SUBSET, ns11.EQ_TYPE, ns11.RHS_RELN, ns11.RHS_OBJECT, ns11.EQ_TP_OFFSET, ns11.RHS_TP_OFFSET, ns11.RETAIN, nmte.RHS_VAR_SET, nmte.RHS_VAR_SUBSET, nmte.RHS_VAR_NAME, 0, CASE WHEN [asp].[VALUE] = NULL THEN 0 ELSE [asp].[VALUE] END ORDER BY CASE WHEN [asp].[VALUE] = NULL THEN 0 ELSE [asp].[VALUE] END; 

Je ne suis pas sûr pourquoi il ne prend pas 0 dans le groupe par article?

Je pense que le groupe par GROUP BY ..., 0, ... est le problème ici. Essayez de supprimer ce 0 partir de là. Il n'y a pas de regroupement ponctuel par une constante.


Sidenote:

 CASE WHEN [AMST_SIM_PAR].[VALUE] = NULL THEN 0 ELSE [AMST_SIM_PAR].[VALUE] END 

devrait être écrit avec IS NULL au lieu de = NULL ou comme:

 COALESCE( [AMST_SIM_PAR].[VALUE], 0 ) 

Je pense que la constante "0" dans votre groupe est le problème.

Utilisez-vous ANSI_NULLS? SQL-92 définit "= NULL" ou "<> NULL" pour toujours returnner false. Essayez de replace "= NULL" par "IS NULL".

Dans votre jointure gauche, vous avez également un critère qui ne correspond pas à la table externe. La jointure interne lie déjà SUB_NET_ID sur ces deux tables afin que vous puissiez le supprimer de votre jointure gauche.

Puisque vous n'acceptez aucun agrégat, pourquoi ne pas simplement utiliser DISTINCT au lieu de répéter tout ce bruit dans GROUP BY ? En outre, ORDER BY n'est pas très utile car vous utilisez SELECT INTO , qui crée une nouvelle table, qui par définition est un set de lignes non ordonnées. Afin d'get datatables de cette table dans le bon «ordre», vous devez utiliser un ORDER BY lorsque vous en select finalement hors. Si vous souhaitez que datatables soient optimisées pour les jointures ou après la création de la table, créez un index clusterisé après SELECT INTO . Enfin, pourquoi utilisez-vous ## des tables temporaires globales? Vous savez que deux users ne peuvent pas exécuter ce code en même time, n'est-ce pas?

Tout cela dit, voici une version beaucoup plus simple et plus facile à lire:

 SELECT DISTINCT n.SYS_ID, n.SUB_NET_ID, n.TEMP_ID, n.EQ_ID, n.NODE_NAME, n.EQ_NAME, n.VAR_NAME, n.VAR_SET, n.VAR_SUBSET, n.EQ_TYPE, n.RHS_RELN, n.RHS_OBJECT, n.EQ_TP_OFFSET, n.RHS_TP_OFFSET, n.RETAIN, te.RHS_VAR_SET, te.RHS_VAR_SUBSET, te.RHS_VAR_NAME, RHS_VAR_TYPE = 0, RHS_VALUE = COALESCE(a.VALUE, 0) INTO ##OT_STEP_1_1 FROM ##NT_STEP_1_1 AS n INNER JOIN ##NT_MASTER_TEMP_EQUATION AS te ON n.SYS_ID = te.SYS_ID AND n.SUB_NET_ID = te.SUB_NET_ID AND n.TEMP_ID = te.TEMP_ID AND n.EQ_ID = te.EQ_ID AND n.NODE_NAME = te.NODE_NAME AND te.SYS_ID = n.SYS_ID AND te.SUB_NET_ID = n.SUB_NET_ID LEFT OUTER JOIN dbo.AMST_SIM_PAR AS a ON te.SYS_ID = a.SYS_ID AND te.SUB_NET_ID = n.SUB_NET_ID AND te.RHS_VAR_NAME = a.VAR_NAME;