在我们的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)
有关于此的任何想法吗?
答案 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 = ?);