SQL从外表中为多列选择多行

时间:2010-03-02 13:49:05

标签: sql

在我们的PostgreSQL数据库中,我们有一个名为'tokens'的表:

token_id | file_cc | file_cc2 | file_cc3 | file_ob

所有以'file_'为前缀的列都包含'files'表的id:

file_id | name | location | hash

我想要的是选择一个令牌,并在结果集中添加所有文件列的文件表中的名称和位置。

使用JOIN这似乎不可行,因为您只能加入一列:

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

有关于此的任何想法吗?

2 个答案:

答案 0 :(得分: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;

它应该达到相同的效果。

答案 1 :(得分: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 = ?);