2012-04-02 3 views
0

Advert 테이블, Newspaper 열은 정수 값을가집니다. 이SQL Server :이 방법에 가입 하시겠습니까?

NewspaperName UnitPrice 
A    12.00 
B    11.00 
C    5.00 

쿼리와 같은

Newspaper 
     1 
     2 
     3 

Newspaper 테이블;

select 
    case 
     when a.Newspaper = 1 then 'A' 
     when a.Newspaper = 2 then 'B' 
     when a.Newspaper = 3 then 'C' 
     when a.Newspaper = 4 then 'D' 
     else 'Empty' 
    end as NewspaperName 
from Advert 
left join... 

조금 어리석은 짓입니다. 하지만 왼쪽에 에 Advert 테이블을 가입시키고 싶습니다. 가입 방법?

+0

가 왜'Advert' 테이블이'Newspaper' 테이블의 기본 키 유형을 사용하지 않는 이유는 무엇입니까? 깨진 디자인처럼 보입니다. – Oded

+0

이렇게 디자인되었습니다. 나쁜 디자인. @Oded – ozkank

+1

그건 내 요점이야. 디자인을 고칠 기회가 없습니까? 'Advertisement '에있는 것과 일치하는'Newspaper'에 정수 열을 추가하고 그것에 가입하십시오. – Oded

답변

3

그냥 서브 쿼리로 "번역 쿼리를"사용

SELECT AdvertTranslated.whatever1, Newspaper.whatever2 FROM 
    (select case when a.Newspaper = 1 then 'A' 
       when a.Newspaper = 2 then 'B' 
       when a.Newspaper = 3 then 'C' 
       when a.Newspaper = 4 then 'D' 
       else 'Empty' 
      end as NewspaperName, 
      whatever1 
     from Advert) AdvertTranslated 
    LEFT JOIN Newspaper ON AdvertTranslated.NewspaperName = Newspaper.NewspaperName 
1

그것은 외래 키없이 두 테이블을 조인 가지 이상하다. 어느 쪽이든지도가 A -> 1, B -> 2이면 각 문자의 ASCII 값을 가져올 수 있으며 직접 매핑을 얻으려면 64를 뺍니다.

그럼 당신은 얻을 것이다 :

SELECT * -- whatever you want to select 
FROM Advert 
LEFT JOIN Newspaper ON Advert.Newspaper = ASCII(Newspaper.NewspaperName) - 64 
0
declare @Advert table(newspaper int) 
insert @Advert values(1), (2), (3), (4) 

declare @Newspaper table(NewspaperName char(1), unitprice money) 
insert @Newspaper values('A', 12.00), ('B', 11.00), ('C', 5.00) 

SELECT a.newspaper, coalesce(b.Newspapername, 'Empty') NewspaperName, b.unitprice 
FROM @Advert a 
LEFT JOIN 
@Newspaper b 
ON char(a.newspaper + 64) = b.NewspaperName