2010-11-05 2 views
1
1. links: link_id, road 
2. roads: road, code 
2. admin_classes: code, admin_class, priority 

Итак, для ОДНОГО LINK_ID У меня есть несколько кодов и несколько admin_class + приоритет Raws Но в итоге установить мне нужна только одну строку для каждого LINK_ID: LINK_ID и admin_class, что относится к минимальному приоритету. Я пытаюсь сделать SQL заявление, как следующее:SQL: как добавить условие на внутренних выберите

select l.link_id, ac.admin_class, min(ac.priority) 
from base.links as l 
inner join base.admin_classes as ac 
on ac.code=l.code 
where ac.admin_class<>0 

, но, во-первых, он не работает, и это не то, что мне нужно. Я хочу только два столбца в наборе результатов - LINK_ID и admin_class

Тогда я пытаюсь следующим:

select l.link_id, (select ac.admin_class from base.admin_classes as ac where ac.code=l.code 
order by ac.priority limit 1) as admin_class from base.links as l 

Это правильно, но я не знаю, как добавить условие на внутреннем выборе, мне нужен только бараны с admin_class <> 0

Я использую PostgreSql 8,3

Спасибо заранее.

ответ

0

Это не работает?

inner join base.admin_classes as ac 
on ac.code=l.code and ac.admin_class<>0 
1

Я не знаком с PostgreSQL, но я предполагаю, что исходный запрос не работает becuse у вас есть функция min() агрегирования с не group by

Тем не менее, должно работать, если вы не «т нужны min():

select l.link_id, ac.admin_class 
from base.links as l 
inner join base.admin_classes as ac 
     on ac.code=l.code 
     and ac.admin_class<>0 

в противном случае, попробуйте:

select l.link_id, ac.admin_class, min(ac.priority) 
from base.links as l 
inner join base.admin_classes as ac 
     on ac.code=l.code 
     and ac.admin_class<>0 
group by l.link_id, ac.admin_class 
+0

Извините, я попытался упростить и написал неверный)) у нас есть followng table 1: link_id, code. table2: id, code, road. table3: дорога, admin_class, приоритет. Таким образом, у нас есть несколько дорог для одного link_id и нескольких строк из таблицы 3 для одного link_id, но мы хотим получить link_id + admin_class с минимальным приоритетом) – user498274

+0

Спасибо за ответ) Но мне нужно всего два столбца в наборе результатов, потому что я использую его в imsert clouse ((И последний оператор возвращает followng raws 1-2-2, 1-3-2, 1-4-2 для одного link_id = 1, но мне нужна только одна строка для одного link_id – user498274

0

Ну я не знаю много о PostgreSql, но это, как это делается с T-SQL:

select l.link_id, ac.admin_class, min(ac.priority) 
from base.links as l 
inner join base.admin_classes as ac 
on ac.code=l.code 
group by l.link_id, ac.admin_class 
having ac.admin_class <> 0 
+0

Я считаю, что «наличие» предложение действительно необходимо, когда вы используете его в сочетании с самим агрегатом.Изменение его «где» и перемещение линии над «группой по» также будет работать :-) –

+0

Я ошибся (у меня есть несколько raws из admin_classes для одного link_id, поэтому ваш запрос возвращает smth вот так: 1-2-2, 1 -3-2 и т. Д. Но мне нужна только одна строка для одного идентификатора ссылки и только два столбца, потому что я использую его в разделе insert – user498274

1

Я считаю, что вы должны сделать две вещи.

1-Создать представление называется viewAdminRoads


CREATE VIEW viewAdminRoads 
AS 
SELECT 
roads.code, 
roads.road, 
admin_classes.admin_class, 
admin_classes.priority 
FROM roads 
INNER JOIN admin_classes 
     ON roads.road 
     = admin_classes.road 
WHERE admin_classes.priority <> 0 

Создание этой точки зрения упрощает весь процесс

2-й Создать свой выбор


SELECT 
link.link_id, 
MIN(viewAdminRoads.priority) as priority 
FROM links 
INNER JOIN viewAdminRoads 
     ON links.code 
     = viewAdminRoads.code 
GROUP BY link.link_id 

Помните, что взгляды ваши Frien д.

+0

. Я согласен, но наша политика проекта не принимает представления. Но я уже разрешаю свою проблему, используя sub выберите. Спасибо за ваш ответ. – user498274

Смежные вопросы