2013-08-30 57 views
0

我有一個貨幣名稱,然後貨幣sk表。 我有第二張表currency_sk_from,currency_sk_to和conversion_rate。在一個表中的兩個SK

我想獲得一個新的表,結合本,所以我得到currency_sk_from,CURRENCY_NAME,currency_sk_to,currency_name_to,CONVERSION_RATE

能有人幫,當我試圖加入它一倍的第二個表的大小。

表一個,看起來像

currency name   Currency SK 
EUR   ,  1 
USD   ,  2 
SEK   ,  3 

表二,貌似

currency_sk_from currency_sk_to conversion_rate 
1  ,   2   , 1.5 
2  ,   1   , .6666 
3  ,   1   , 41 

我要的是

currency_sk_from currency_name currency_sk_to currency_name_to conversion_rate 
1  ,  EUR   , 2   ,  USD   ,  1.5 
2  ,  USD   , 1   ,  EUR   ,  .6666 
3  ,  SEK   , 1   ,  EUR   ,  41 
+1

這一切都取決於你加入以及您的數據結構如何。你能提供樣本數據和你正在運行的查詢嗎? – HotblackDesiato

+0

@JohnHenry。 。 。 「sk」意味着什麼或者它是否代表瑞典克朗?一些樣本數據可以真正幫助傳達您想要的內容。 –

+0

@GordonLinoff sk表示一個唯一的鍵在表1中扮演唯一標識符 –

回答

2

的加入,您可以嘗試使用子查詢代替: -

SELECT CURRENCY_SK_FROM, 
     (SELECT CURRENCY_NAME 
      FROM CURRENCY 
      WHERE CURRENCY_SK = CURRENCY_SK_FROM) AS CURRENCY_NAME, 
     CURRENCY_SK_TO, 
     (SELECT CURRENCY_NAME 
      FROM CURRENCY 
      WHERE CURRENCY_SK = CURRENCY_SK_TO) AS CURRENCY_NAME_TO, 
     CONVERSION_RATE 
    FROM CONVERSION_RATE_TABLE; 
+0

如果CURRENCY表中存在重複的行,那麼您的查詢將失敗,請檢查http://sqlfiddle.com/#!3/26e09e/7,您需要在子查詢中添加DISTINCT,如http://sqlfiddle.com /#!3/26e09e/8。 –

+0

@snyder,這是真的,但從模式設計看來,'CURRENCY_SK'是'CURRENCY'表上的唯一標識符。如果不是,那肯定是應該的。我期望'CURRENCY_SK_FROM'和'CURRENCY_FK_TO'列在'CURRENCY'表中有一個外鍵約束,並且還有'NOT NULL'約束,以便始終可以找到貨幣名稱。 –

+0

那麼查詢的結果集有什麼區別,它使用結果集中的連接查詢,儘管我更喜歡使用子查詢,因爲它顯然更快,但如果CURRENCY表沒有重複項,那麼連接表如何加倍行。 –

0

如果我理解了問題正確地在qu下面ERY將做的工作:

SELECT DISTINCT 
    cskf.currency_sk_from, 
    cskfrom.currency_name, 
    cskf.currency_sk_to, 
    cskto.currency_name currency_name_to, 
    cskf.conversion_rate 
    FROM 
    currency_sk cskfrom 
    JOIN 
    currency_sk_from cskf ON 
    cskfrom.currency_sk = cskf.currency_sk_from 
    JOIN 
    currency_sk cskto ON 
    cskto.currency_sk = cskf.currency_sk_to 

小提琴:http://sqlfiddle.com/#!3/26e09e/2

+0

這是導致重複集合的連接類型不幸@snyder –

+0

@John Henry您可以提供一些數據,連接查詢給出重複結果? –

0

要做到這一點作爲一個select,你需要兩個連接來獲得兩種貨幣:

select t2.currency_sk_from, fromname.currency as from_name, 
     t2.currency_sk_to, toname.currency as to_name, t2.conversion_rate 
from table2 t2 join 
    table1 fromname 
    on t2.currency_sk_from = fromname.sk join 
    table1 toname 
    on t2.currency_sk_to = toname.sk; 

其實我不認爲你需要一張新桌子。這很容易設置爲獲取貨幣名稱的視圖。

編輯:

你應該重複檢查在table1,這樣做:

select sk, count(*) 
from table1 
group by sk 
having count(*) > 1 
+0

這會導致行數加倍。我想保持行與連接之前一樣,只需添加兩個名字@Gordon_Linoff –

+0

@JohnHenry。 。 。這隻會增加行數,如果你在'table1'中有重複的話。 –

相關問題