2017-11-27 23 views
1

죄송합니다. 이전에 질문을 받았다면 많은 질문을 거쳤지만이 문제에 적용 할 수있는 답변을 찾을 수 없었습니다.캐스팅 가능 데이터와 캐싱 할 수없는 데이터가 혼합 된 열에 두 개의 테이블을 조인 할 수 있습니까?

데이터베이스에서 SSRS 보고서를 작성 중입니다. 읽기 전용 액세스 권한이 있으며 원하는 형식으로 데이터를 선택하는 데 문제가 있습니다.

Table 1: Referenced Data 
==== ============= 
ID Description 
==== ============= 
1 Apple   
2 Orange  
3 Pear   
==== ============= 

Table 2: Records 
==== ====== ======== 
ID Data Tag 
==== ====== ======== 
1 1  List  
2 2  List  
3 Red String 
4 Blue String 
5 3  List  
==== ====== ======== 

은 내가보고 싶은 것은 :

Report 
========== ========= 
RecordNo Content 
========== ========= 
    1  Apple  
    2  Orange 
    3  Red  
    4  Blue  
    5  Pear  
========== ========= 

문제는 T1의 ID 열이 BIGINT 동안 T2의 데이터 열은 NVARCHAR이다. List 태그로 행만 선택하여 변환 오류를 피할 수는 있지만 String 데이터는 손실됩니다.

select 문에서 수행하려는 작업을 수행 할 방법이 있습니까? 이것은 약간의 창의력으로 할 수있는 일이지만 여전히 학습 과정에 있으며 SQL은 아직 거기에 없다고 생각합니다.

+0

어느 dbms ???????? – Eric

+0

안녕하세요, Eric, 사과 SQL 서버였습니다. – Jared

답변

0
SELECT 
    rec.Id 
    ,Content = CASE WHEN data.Id IS NOT NULL THEN data.Description ELSE rec.Data END 
FROM 
    Records rec 
    LEFT JOIN ReferencedData data 
    ON rec.Tag <> 'String' 
    AND rec.Data = CAST(data.Id AS NVARCHAR(50)) 

당신은 암시 적 변환 오류가 발생하지 않도록됩니다 조인 조건의 일부로 NVARCHARBIGINT 전송할 수 있습니다.

+0

굉장합니다, 고마워요, 매트. 이것은 트릭을했다. 나는 bigint 변환 오류 문자열에 내 머리를 건 드리는 것이 너무 바빴다. 대신 bigint 캐스팅을 고려하지 않았다. 그리고이 일에 도움을 주신 모든 분들께 감사드립니다. – Jared

0

당신은 이런 식으로 뭔가를 시도 할 수 :

;WITH DataNum AS 
(
SELECT ID, Data FROM Records WHERE ISNUMERIC(Data) = 1 
) 
SELECT dn.ID, rd.Description 
FROM DataNum dn 
JOIN ReferencedData rd ON dn.Data = rd.ID 
UNION ALL 
SELECT ID, Data 
FROM Records 
WHERE ISNUMERIC(Data) <> 1 
0
select table2.id 
    , coalesce(table1.description, table2.Data) content 
    from table2 
    left join table1 
    on table2.tag <> 'String' 
    and table1.id = table2.data 
order by table2.id 

이 MySQL을 (SQL Fiddle)에서 작동하지만 SQL 서버 (SQL Fiddle) 및 Oracle에 약간의 변화 (SQL Fiddle)가 필요합니다

select table2.id 
    , coalesce(table1.description,table2.Data) content 
    from table2 
    left join table1 
    on table2.tag <> 'String' 
    and table1.id = case when table2.tag <> 'String' then table2.data end 
order by table2.id 

과 PostgreSQL이 (SQL Fiddle)는 더 형식에 설정을 몇 필요 :

select table2.id 
    , coalesce(table1.description,table2.Data) as content 
    from table2 
    left join table1 
    on table2.tag <> 'String' 
    and cast(table1.id as varchar(6)) = table2.data 
order by table2.id