2010-03-02 63 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; 

,它应该获得相同的结果。