2010-03-02 154 views
1

在我們的PostgreSQL數據庫從外部表多行,我們稱之爲表「令牌」:與「_文件」前綴SQL選擇多列

token_id | file_cc | file_cc2 | file_cc3 | file_ob 

所有列包含的ID的「文件」表:

file_id | name | location | hash 

我要的是選擇一個令牌以及將結果集從文件表中添加的名稱和位置所有文件列。

隨着加入這個似乎並沒有這樣做,能,因爲你只能在一列連接:

select * from tokens t 
left join files f 
on (t.file_cc = f.file_id) 

任何想法,對此有何看法?

回答

1

您必須連接到文件表4次或使用類似於以下的查詢,查詢令牌4次以獲取file_ids(這應該由於索引而便宜),然後在文件表上運行一個查詢。

select * from files 
where file_id in (select file_cc from tokens where token_id = ?) 
     or file_id in (select file_cc2 from tokens where token_id = ?) 
     or file_id in (select file_cc3 from tokens where token_id = ?) 
     or file_id in (select file_ob from tokens where token_id = ?); 
2

我敢肯定在ON子句中可以有多個條件。所以,你應該能夠做到:

SELECT * FROM tokens t 
LEFT JOIN files f 
    ON (t.file_cc = f.file_id OR 
     t.file_cc2 = f.file_id OR 
     t.file_cc3 = f.file_id OR 
     t.file_ob = f.file_id); 

如果不工作,你可以轉換ON條件WHERE條件:

SELECT * FROM tokens t 
LEFT JOIN files f 
    WHERE 
     t.file_cc = f.file_id OR 
     t.file_cc2 = f.file_id OR 
     t.file_cc3 = f.file_id OR 
     t.file_ob = f.file_id; 

,它應該獲得相同的結果。