将MySQL查询转换为SQL Server(MSSQL / SQLSRV)(WiTH DISTINCT)

时间:2011-10-25 18:22:58

标签: mysql sql-server

如何将此查询转换为在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

3 个答案:

答案 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