2012-04-21 6 views
0

У меня есть 6 таблиц, которые я пытаюсь соединить в одном запросе; однако я не могу понять, как написать запрос.Postgresql Query with joins

Вот мои таблицы выделены жирным шрифтом и столбцы, которые они содержат.

пг
PGID

IPG
ipgid
Roid
PGID

мкг

Владельцам заведений


Юг IUID
ROID

Владельцам заведений

ро
ROID
ИНИД

в
ИНИД

Моя цель состоит в том, чтобы вывести inid поле с определенными критериями от pg и ug таблицы. Я хочу найти все записи inid, где pg.pgid=1 и ug.ugid=2. Это связано с большим количеством объединений, и я думаю, что некоторые из них выбираются в статутах, но я недостаточно осведомлен о том, как собрать все вместе.

Вот то, что я до сих пор ...

SELECT inid 
FROM in 
INNER JOIN ro ON in.inid = ro.inid 
INNER JOIN iug ON ro.roid = iug.roid 
INNER JOIN ug ON iug.ugid = ug.ugid 
INNER JOIN ipg ON ro.roid = ipg.roid 
INNER JOIN pg ON ipg.pgid = pg.pgid 
WHERE pg.pgid = 1 
    AND ug.ugid = 2 
+0

Вы не получили результат, который ищете? Кстати, я думаю, что соединение на 'pg' может быть ненужным; он будет только фильтровать результаты, если нет 'pgid = 1'. –

+1

Какая у вас ошибка? – vyegorov

ответ

3

Вы не можете назвать таблицу in, то есть в каждом стандарте SQL и PostgreSQL reserved word. Если вы попробуете, вы получите синтаксическую ошибку. Вы все равно можете заставить систему принять его, если вы double quote the nameCREATE TABLE "in" ..., но тогда вы должны помнить о том, чтобы дважды указывать его каждый раз, когда вы его используете, и вы получите путаные сообщения об ошибках. Короче: не делайте этого.
Я переименовал таблицу tbl_in и дал ей псевдоним в запросе.

Кроме того, inid является неоднозначным как элемент SELECT. Либо используйте USING как условие соединения (тогда только один столбец inid находится в результирующем наборе) или table-qualify имя столбца.

В противном случае запрос выглядит отлично:

SELECT i.inid -- ambiguous without table-qualification 
FROM tbl_in i -- renamed table 
JOIN ro ON i.inid = ro.inid 
JOIN iug ON ro.roid = iug.roid 
JOIN ug ON iug.ugid = ug.ugid 
JOIN ipg ON ro.roid = ipg.roid 
JOIN pg ON ipg.pgid = pg.pgid 
WHERE pg.pgid = 1 
AND ug.ugid = 2; 

Если у вас есть ограничения внешнего ключа между pg и ipg и между ug и iug, то можно упростить:

SELECT i.inid -- ambiguous without table-qualification 
FROM tbl_in i -- renamed table 
JOIN ro ON i.inid = ro.inid 
JOIN iug ON ro.roid = iug.roid 
JOIN ipg ON ro.roid = ipg.roid 
WHERE ipg.pgid = 1 
AND iug.ugid = 2; 

... потому что однажды нашел в iug/ipg значения, как ожидается, будут присутствовать в up/pg.

+0

Это сработало так, как вы сказали Эрвину. Мне пришлось изменить некоторые имена таблиц, потому что они были слишком длинными, и я хотел, чтобы это было просто. Я не понял, что создал имя таблицы IN. Теперь запрос отлично работает. – jsmithy