SQL 服务器:不同的结果
SQL Server : Distinct results
我有以下SQL服务器查询
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)
您的请求存在逻辑问题。由于 19, Poitiers
有两个不同的 idetapa 值,idtramo(即 2, 6
和 2, 7
),SQL 如何知道根据哪对对结果进行排序?在 SELECT
子句中包含列的要求是此要求的自然结果。使用分组和 min
/max
(或 window 函数)告诉 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
我有以下SQL服务器查询
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)
您的请求存在逻辑问题。由于 19, Poitiers
有两个不同的 idetapa 值,idtramo(即 2, 6
和 2, 7
),SQL 如何知道根据哪对对结果进行排序?在 SELECT
子句中包含列的要求是此要求的自然结果。使用分组和 min
/max
(或 window 函数)告诉 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