2014-02-06 46 views
3

大家好,我有一個表TableC,它保存來自兩個不同表TableATableB的主鍵值。因爲它們是來自兩個表的主鍵,所以我可能會在tableC中得到重複項,所以當存儲值時,我在主鍵前加上一個簡短的文本來區分哪個值來自哪個表。根據不同表值加入

現在我想加入這個tableCTableATableBtableA獲取數據和TableB

TableC : 

ID_Column 
1A 
1B 
2A 

TableA: 

ID_Column | Data 
1   | data A 1 
2   | data A 2 
3   | data A 3 

TableB: 

ID_Column | Data 
1   | data B 1 
2   | data B 2 
3   | data B 3 

這是我一直在努力做

select C.ID_Column, data 
from tableC C 
     inner join tableA A 
on A.ID_Column = left(C.ID_Column, 1) 
     inner join tableB B 
on B.ID_Column = left(C.ID_Column, 1) 

這將返回來自兩個表的數據我想從表b返回數據時ID_Column最後有B並且想要返回的數據0時ID_Column具有到底A

預先感謝您。

+0

只是出於興趣 - 爲什麼你不是剛剛添加第二列來標識tableC中的源表?或者甚至更好,兩列tablea_id和tableb_id(所以你會有一個十字表) –

回答

2

那麼,TableC應該至少有2列,一個用於id,另一個用於標識它屬於哪個表。無論如何,這可以做到這樣:

SELECT C.ID_Column, 
     ISNULL(A.Data,B.Data) Data 
FROM TableC C 
LEFT JOIN TableA A 
    ON LEFT(C.ID_Column,LEN(C.ID_Column)-1) = A.ID_Column 
    AND RIGHT(C.ID_Column,1) = 'A' 
LEFT JOIN TableB B 
    ON LEFT(C.ID_Column,LEN(C.ID_Column)-1) = B.ID_Column 
    AND RIGHT(C.ID_Column,1) = 'B' 

的結果是:

╔══════════╦══════════╗ 
║ D_COLUMN ║ DATA ║ 
╠══════════╬══════════╣ 
║ 1A  ║ data A 1 ║ 
║ 1B  ║ data B 1 ║ 
║ 2A  ║ data A 2 ║ 
╚══════════╩══════════╝ 

And here is a demo,您可以嘗試。

+0

非常感謝你的幫助先生 – user3280595

+0

好的答案,以及我很高興你提到重構tableC。 @ user3280595出於性能原因,您應該避免在謂詞的「列」中進行計算。 「列運算符值」。如果您好奇爲什麼,請爲SARG提供谷歌搜索。 –

0

你顯然需要稍微調整一下,但是你可以考慮重構表C嗎?將兩者分開,這將消除連接中的計算(不是一個好的性能策略)。

--Create Table A 
IF OBJECT_ID('tempdb..#TableA') IS NOT NULL DROP TABLE #TableA 
CREATE TABLE #TableA (ID_COLUMN INT, DATA VARCHAR(max)) 
INSERT INTO #TableA(ID_COLUMN,DATA) VALUES (1,'data A 1'),(2,'data A 2'),(3,'data A 3') 

--Create Table B 
IF OBJECT_ID('tempdb..#TableB') IS NOT NULL DROP TABLE #TableB 
CREATE TABLE #TableB (ID_COLUMN INT, DATA VARCHAR(max)) 
INSERT INTO #TableB (ID_COLUMN,DATA) VALUES (1,'data B 1'),(2,'data B 2'),(3,'data B 3') 

--Create Table C 
IF OBJECT_ID('tempdb..#TableC') IS NOT NULL DROP TABLE #TableC 
CREATE TABLE #TableC (ID_COLUMN INT, ORIGIN_TABLE CHAR(1)) 
INSERT INTO #TableC (ID_COLUMN, ORIGIN_TABLE) VALUES (1,'A'), (1,'B'),(2,'A') 

SELECT A.ID_COLUMN, A.DATA 
FROM  #TableC AS C 
     INNER JOIN #TableA AS A ON (C.ID_COLUMN = A.ID_COLUMN) 
WHERE C.ORIGIN_TABLE = 'A' 
UNION ALL 
SELECT B.ID_COLUMN, B.DATA 
FROM  #TableC AS C 
     INNER JOIN #TableB AS B ON (C.ID_COLUMN = B.ID_COLUMN) 
WHERE C.ORIGIN_TABLE = 'B'