SQL Server:结果不同

时间:2016-01-20 08:38:26

标签: sql sql-server distinct

我有以下SQL Server查询

SELECT DISTINCT 
    e.idetapa, t.idtramo, m.idmunicipio, m.nombre
FROM 
    terapia h, municipios m, tramos t, rutas r, etapas e 
WHERE 
    r.idruta = 15 
    AND h.consume = 's' 
    AND h.idmunicipio = m.idmunicipio 
    AND r.idruta = t.idruta 
    AND e.idruta = r.idruta 
    AND t.idetapa = e.idetapa 
    AND (m.idmunicipio = t.idmuniini OR m.idmunicipio = t.idmunifin)
ORDER BY 
    e.idetapa, t.idtramo

这是我在执行时得到的:

idetapa, idtramo, idmunicipio, nombre
2, 6, 19, Poitiers
2, 7, 19, Poitiers
3, 7, 28, Lyon
3, 8, 28, Lyon
7, 4, 53, Bordeaux
8, 1, 53, Bordeaux
12, 6, 37,Paris
13, 1, 37,Paris
.
.
.

我想修改这个查询,以便给我一个独特的idmunicipio和idnombre,由idetapa和idtramo命令,如下结果:

19, Poitiers
28, Lyon
53, Bordeaux
37, Paris

我该怎么办?感谢。

2 个答案:

答案 0 :(得分:1)

排除其他列

SELECT DISTINCT m.idmunicipio, m.nombre
FROM terapia h, municipios m, tramos t, rutas r, etapas e 
WHERE r.idruta=15 AND h.consume='s' AND h.idmunicipio=m.idmunicipio 
AND r.idruta=t.idruta AND e.idruta=r.idruta AND t.idetapa=e.idetapa 
AND (m.idmunicipio=t.idmuniini OR m.idmunicipio=t.idmunifin)

答案 1 :(得分:1)

您的请求存在逻辑问题。因为对于19, Poitiers,idetapa有两个不同的值,idtramo(即2, 62, 7)SQL如何知道根据哪一对对结果进行排序?在SELECT子句中包含列的要求是此要求的自然结果。使用分组和min / max(或窗口函数)来告诉SQL哪些对更重要,并根据聚合结果进行排序。例如:

SELECT S.idmunicipio, S.nombre
FROM
(
  SELECT
      max(e.idetapa) as idetapa, max(t.idtramo) as idtramo,
      m.idmunicipio, m.nombre
  FROM 
      terapia h, municipios m, tramos t, rutas r, etapas e 
  WHERE 
      r.idruta = 15 
      AND h.consume = 's' 
      AND h.idmunicipio = m.idmunicipio 
      AND r.idruta = t.idruta 
      AND e.idruta = r.idruta 
      AND t.idetapa = e.idetapa 
      AND (m.idmunicipio = t.idmuniini OR m.idmunicipio = t.idmunifin)
  GROUP BY
      m.idmunicipio, m.nombre
) as S
ORDER BY 
    S.idetapa, S.idtramo