2012-04-02 4 views
0

広告テーブル、新聞の列は整数値をとります。この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... 

ちょっと愚かです。しかし、私はNewspaperAdvertテーブルを参加させたい。これに参加するには?

+0

はなぜ 'Advert'テーブルは' Newspaper'テーブルのプライマリキータイプを使用しないのですか?壊れたデザインのように見えます。 – Oded

+0

このように設計されています。デザインが悪い。 @Oded – ozkank

+1

それは私の主張です。デザインを修正するチャンスはありませんか? '広告 'にあるものと一致する' 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

それは外部キーなしで2つのテーブルを結合するために一種の奇妙です。どちらの方法でも、マップが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 
関連する問題