2012-04-21 74 views
0

我有6個表,我試圖在1個查詢中連接在一起;但是,我不能完全弄清楚如何編寫查詢。帶連接的Postgresql查詢

這裏是我的粗體表格和它們包含的列。

PG
PGID

IPG
ipgid
ROID
PGID

微克
UGID

IUG
IUID
固醇
UGID

RO
固醇
INID


INID

我的目標是輸出inid字段給出了來自ug表的某些標準。我想查找所有inid條目,其中pg.pgid=1ug.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'的情況下過濾結果。 – 2012-04-21 04:24:32

+1

你有什麼錯誤? – vyegorov 2012-04-21 08:01:31

回答

3

你不能說出你的表in,即在每一個SQL標準和PostgreSQL中reserved word。如果你嘗試,你會得到一個語法錯誤。如果您使用double quote the nameCREATE TABLE "in" ...,您仍然可以強制系統接受它,但是您必須記住在每次使用它時加上雙引號,否則您會收到令人困惑的錯誤消息。總之:不要那樣做。
我將表tbl_in重命名並在查詢中給它一個別名。另外,inid不明確作爲SELECT項目。使用USING作爲連接條件(然後只有一個inid在結果集中)或表格限定列名稱。

否則查詢看起來不錯:

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; 

如果你有外鍵約束pgipg之間和ugiug之間,那麼你就可以簡化:

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

就像你說的Erwin那樣工作。我不得不改變一些表名,因爲它們太長了,我想保持簡單。我沒有意識到我創建了一個IN表名。查詢現在完美謝謝。 – jsmithy 2012-04-24 13:15:43