2016-01-20 36 views
0

我有以下SQL Server查詢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 
. 
. 
. 

我想以此來給我UNIQUE修改此查詢idmunicipio和idnombre,通過idetapa和idtramo有序的,這樣的結果:

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

我能做些什麼?謝謝。

+0

'SELECT DISTINCT idmunicipio,idnombre FROM ... ORDER BY idetapa,idtramo' – jarlh

+3

切換到現代明確'JOIN'語法,而不是!易於編寫(沒有錯誤),讀取,並在需要時轉換爲外部聯接。 – jarlh

+0

我不能做你選擇的原因,當我把一個DISTINCT子句,MS SQL說我需要把idetapa和idtramo在SELECT元素。 – walolinux

回答

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 
+0

它開箱即用! – walolinux

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) 
+0

我需要通過idetapa,idtramo命令,如果按這兩個字段排序,我需要將它們放在select子句中。 – walolinux