如何将此查询转换为在SQL Server中工作,我需要做什么?
SELECT
DISTINCT(map_objetivos.OBJ_RowID) AS test,
map_objetivos.OBJ_Objetivo
FROM
map_admin_caminho_critico_indicadores
INNER JOIN
map_admin_caminho_critico ON CCR_RowID = CCI_CaminhoDR
INNER JOIN
map_indicadores ON IND_RowID = CCI_IndicadorDR
INNER JOIN
map_objetivos ON OBJ_RowID = IND_ObjetivoDR
GROUP BY
map_objetivos.OBJ_RowID
答案 0 :(得分:5)
与MySQL不同,SQL Server不允许在选择列表中使用未聚合或分组的字段。此外,您的DISTINCT
也是多余的。试试这个:
SELECT
map_objetivos.OBJ_RowID AS test,
map_objetivos.OBJ_Objetivo
FROM
map_admin_caminho_critico_indicadores
INNER JOIN
map_admin_caminho_critico ON CCR_RowID = CCI_CaminhoDR
INNER JOIN
map_indicadores ON IND_RowID = CCI_IndicadorDR
INNER JOIN
map_objetivos ON OBJ_RowID = IND_ObjetivoDR
GROUP BY
map_objetivos.OBJ_RowID,
map_objetivos.OBJ_Objetivo
答案 1 :(得分:3)
SELECT
map_objetivos.OBJ_RowID AS test, <<-- all non-aggregate fields
<<-- must be in the group by
MAX(map_objetivos.OBJ_Objetivo) as OBJ_Objetivo <<-- put the rest in a dummy
<<-- aggregate.
FROM
map_admin_caminho_critico_indicadores
INNER JOIN
map_admin_caminho_critico ON CCR_RowID = CCI_CaminhoDR
INNER JOIN
map_indicadores ON IND_RowID = CCI_IndicadorDR
INNER JOIN
map_objetivos ON OBJ_RowID = IND_ObjetivoDR
GROUP BY
map_objetivos.OBJ_RowID
此查询的运行速度比group by子句中包含额外字段的查询要快
如果您希望查询快速运行,则只需将唯一定义所选字段中的字段放入组中。
使用MIN()或MAX()聚合来使SQL服务器停止抱怨
因为其他选定的字段在功能上依赖于group by子句,所以结果集中每行只有一个值,而MAX()函数不会减慢你的速度。
超长的group by子句会降低查询速度。
请记住,如果其他字段在功能上依赖于group by子句,则只使用此技巧
关于Distinct
这段代码:
SELECT
DISTINCT(map_objetivos.OBJ_RowID) AS test,
map_objetivos.OBJ_Objetivo
与此代码相同
SELECT DISTINCT
map_objetivos.OBJ_RowID AS test,
map_objetivos.OBJ_Objetivo
您无法在选择中的单个字段上使用DISTINCT
如果您想 使用GROUP BY
在子选择中使用单个字段。
SELECT f1,f2,f3 <<-- trick to select the first distinct f1 rows.
FROM t1 WHERE id IN (
SELECT MIN(id) as FirstID FROM t1
GROUP BY f1)
答案 2 :(得分:1)
您正在对一个字段进行分组,但第二个字段未在聚合中使用。请尝试以下方法。
SELECT
DISTINCT(map_objetivos.OBJ_RowID) AS test,
map_objetivos.OBJ_Objetivo
FROM
map_admin_caminho_critico_indicadores
INNER JOIN
map_admin_caminho_critico ON CCR_RowID = CCI_CaminhoDR
INNER JOIN
map_indicadores ON IND_RowID = CCI_IndicadorDR
INNER JOIN
map_objetivos ON OBJ_RowID = IND_ObjetivoDR
GROUP BY
map_objetivos.OBJ_RowID,
map_objetivos.OBJ_Objetivo
编辑:正如JUNK所提到的那样 - 在这种情况下明显是多余的。
SELECT
map_objetivos.OBJ_RowID AS test,
map_objetivos.OBJ_Objetivo
FROM
map_admin_caminho_critico_indicadores
INNER JOIN
map_admin_caminho_critico ON CCR_RowID = CCI_CaminhoDR
INNER JOIN
map_indicadores ON IND_RowID = CCI_IndicadorDR
INNER JOIN
map_objetivos ON OBJ_RowID = IND_ObjetivoDR
GROUP BY
map_objetivos.OBJ_RowID,
map_objetivos.OBJ_Objetivo