我有以下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
我该怎么办?感谢。
答案 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, 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