2014-02-13 4 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_val 또는 int_val)을 선택하는 것입니다.

단일 쿼리로이 작업을 수행 할 수 있습니까?

+1

선택하려는 대상에 따라 달라집니다. –

+0

이 테이블과 원하는 출력에서 ​​몇 가지 샘플 데이터를 제공 할 수 있습니까? – KrazzyNefarious

+0

되돌릴 열의 데이터 유형은 무엇입니까? 열은 단 하나의 데이터 유형 만 가질 수 있습니다 (특이한 SQL 확장을 제외하고). –

답변

1

예, 당신이 할 수 있습니다와 언제 외부 케이스를 조인 :

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

작동, thanks – 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'