Sql 按条款分组发布

Sql 按条款分组发布,sql,sql-server,Sql,Sql Server,我已经在access中编写了一个查询,现在我正在尝试在SQL Server中编写相同的查询,但遇到以下错误: Msg 164,15级,状态1,程序OQRY_步骤1_1,第15行 每个GROUP BY表达式必须至少包含一个非外部引用的列 我的SQL查询如下: SELECT ns11.SYS_ID, ns11.SUB_NET_ID, ns11.TEMP_ID, ns11.EQ_ID, ns11.NODE_NAME, ns11.EQ_NAME,

我已经在access中编写了一个查询,现在我正在尝试在SQL Server中编写相同的查询,但遇到以下错误:

Msg 164,15级,状态1,程序OQRY_步骤1_1,第15行 每个GROUP BY表达式必须至少包含一个非外部引用的列

我的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?

我认为group by中的常量“0”是问题所在

您是否使用ANSI_空值?SQL-92定义=NULL或NULL以始终返回false。尝试将=NULL更改为IS NULL

在左联接中,还有一个与外部表不匹配的条件。内部联接已经链接了这两个表上的SUB_NET_ID,因此您可以将其从左侧联接中删除。

我认为组由…,0。。。问题就在这里。尝试从中删除该0。没有按常量分组的点

旁注:

CASE WHEN [AMST_SIM_PAR].[VALUE] = NULL
THEN 0
ELSE [AMST_SIM_PAR].[VALUE]
END
应使用IS NULL而不是=NULL或as写入:


既然您没有使用任何聚合,为什么不直接使用DISTINCT,而不是重复分组中的所有噪音?此外,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;

0分组的目的是什么?如果你移除它会发生什么?你是否在系统ID和子网络ID之间的内部连接的前两个部分丢失了一个和?我的眼睛都烧焦了。回车、制表符和别名都是你的朋友,相信我:所以是可读的表名,但你可能无法控制。23个问题,0张选票,有吗?没有,它不起作用,我仍然收到错误…但我认为错误是因为分组中的0。然后从分组中删除该0!
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;