SQL Server:不同的结果

SQL Server:不同的结果,sql,sql-server,distinct,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.id

我有以下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
我能做什么?谢谢。

排除其他列

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)
排除其他列

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)

您的请求存在逻辑问题。由于对于
19,Poitiers
有两个不同的idetapa和idtramo值(即
2,6
2,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

您的请求存在逻辑问题。由于对于
19,Poitiers
有两个不同的idetapa和idtramo值(即
2,6
2,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

选择不同的idmunicipio,idnombre FROM。。。按idetapa排序,idtramo
切换到现代显式
连接
语法!更易于编写(无错误)、读取,并在需要时转换为外部联接。我无法执行select操作。当我放置DISTINCE子句时,SQL小姐说我也需要将idetapa和idtramo放置在select元素中。抱歉,对我来说太早了。(需要更多咖啡…)选择DISTINCT时,只能按选定列排序。(考虑当一个idmunicipio有几个不同的idetapa值时的情况,如何订购?)您的请求存在逻辑问题。因为对于
19,Poitiers
有两个不同的值用于
idetapa,idtramo
(即
2,6
27
),SQL应该如何知道根据哪对对结果进行排序?在
SELECT
条款中包含列的要求是该要求的自然结果。使用分组和
min
/
max
(或窗口函数)告诉SQL哪一对对更重要,并根据聚合结果进行排序。
从。。。按idetapa排序,idtramo
切换到现代显式
连接
语法!更易于编写(无错误)、读取,并在需要时转换为外部联接。我无法执行select操作。当我放置DISTINCE子句时,SQL小姐说我也需要将idetapa和idtramo放置在select元素中。抱歉,对我来说太早了。(需要更多咖啡…)选择DISTINCT时,只能按选定列排序。(考虑当一个idmunicipio有几个不同的idetapa值时的情况,如何订购?)您的请求存在逻辑问题。因为对于
19,Poitiers
有两个不同的值用于
idetapa,idtramo
(即
2,6
27
),SQL应该如何知道根据哪对对结果进行排序?在
SELECT
条款中包含列的要求是该要求的自然结果。使用分组和
min
/
max
(或窗口函数)告诉SQL哪一对更重要,并根据聚合结果进行排序。我需要按idetapa、idtramo排序,如果按这两个字段排序,我需要将它们放在select子句中。我需要按idetapa、idtramo排序,如果按这两个字段排序,我需要把它们放在select子句中。