2011-09-19 138 views
1

我在访问书写的查询,现在我试图写在SQL Server中我得到下面的错误是一样的:GROUP BY子句问题

Msg 164, Level 15, State 1, Procedure OQRY_STEP_1_1, Line 15 Each GROUP BY expression must contain at least one column that is not an outer reference.

我的SQL查询如下:

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; 

我不确定为什么它不会在group by子句中取0?

+0

什么是集团的'BY 0'的目的是什么?如果你删除它会发生什么? –

+2

您是否缺少SYS_ID和SUB_NET_ID部分之间的内部联接的前两部分? –

+1

我的眼睛在燃烧。回车,标签和别名是你的朋友,相信我。 :-)所以可读的表名,但你可能无法控制。 –

回答

1

我认为GROUP BY ..., 0, ...是这里的问题。尝试从那里删除0。按常数分组没有意义。


旁注:

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

IS NULL而不是= NULL或将被写成:

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

没有它的不工作我仍然收到错误...但我认为错误是因为组中的0。 – CPDS

+1

然后从“GROUP BY”中删除'0'! –

1

我认为你的小组的常数'0'是问题所在。

您使用的是ANSI_NULLS吗? SQL-92将“= NULL”或“<> NULL”定义为始终返回false。尝试将“= NULL”更改为“IS NULL”。

同样在你的左连接中,你有一个与外表不符的标准。内部连接已将这两个表上的SUB_NET_ID链接起来,因此您可以将它从左侧连接中移除。

0

既然你不采取任何聚集,为什么不使用DISTINCT代替在GROUP BY重复所有的噪音? ORDER BY也不是很有用,因为您使用的是SELECT INTO,它创建了一个新表,该表根据定义是无序的一组行。为了以正确的“顺序”从表中获取数据,最终在选择时应该使用ORDER BY。如果您希望为连接优化数据或在创建表后创建了哪些数据,请在SELECT INTO之后创建聚簇索引。最后,为什么你使用##全局临时表?你知道两个用户不能同时执行这个代码,对吗?

所有这一切说,这里是一个更简单,更易于阅读的版本:

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;