2014-02-13 63 views
1

这里我的数据库结构的简化:选择连接表的列值

+-----------+ +-----------+ +-------------+ 
| data | | int_val | | float_val | 
+-----------+ +-----------+ +-------------+ 
| data_id | | val_id | | val_id  | 
| type  | | int_val | | float_val | 
| value_ref | +-----------+ +-------------+ 
+-----------+ 

data.value_ref未声明为外键,但它是。这个想法是使用data.type column来选择加入哪个表(float_valint_val)。

我可以使用单个查询来做到这一点吗?

+1

这取决于你想要选择什么,我相信。 –

+0

可以请您提供一些来自这些表格和所需输出的示例数据吗? – KrazzyNefarious

+0

你想要回来的列的数据类型是什么?一列只能有一个数据类型(禁止不寻常的SQL扩展)。 –

回答

1

是的,你可以做到这一点与外连接和CASE WHEN:

select 
    case when type = 'int' 
     then int_val.int_val 
     else float_val.float_val 
    end 
from 
    data 
    left join int_val on data.value_ref=val_id 
    left join float_val on data.value_ref=val_id 

这假定value_ref将在任一int_val或float_val存在,但不能同时使用。

+0

它的工作,谢谢 – Alvins

+0

但是,如果我使用string_val表,它不起作用。我得到'类型整数和varchar不匹配' – Alvins

+0

您正在使用哪种RDBMS? – Joe

0
SELECT 
    data.id, 
    COALESCE(CAST(int_val.int_val AS FLOAT), float_val.float_val) AS value 
FROM data 
LEFT JOIN int_val 
     ON int_val.val_id = data.value_ref 
     AND data.type = 'int' 
LEFT JOIN float_val 
     ON float_val.val_id = data.value_ref 
     AND data.type = 'float'