2016-01-20 3 views
0

Я запрос следующего SQL ServerSQL 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 
. 
. 
. 

Я хочу изменить этот запрос, чтобы дать мне 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

Я не могу сделать вашу причину select, когда я ставлю предложение DISTINCT, MS SQL говорит, что мне нужно также добавить idetapa и idtramo в элементы SELECT. – walolinux

ответ

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 
+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 и, если вы закажете эти 2 поля, мне нужно поместить их в предложение select. – walolinux