根据不同表的值加入

时间:2014-02-06 17:13:28

标签: sql-server sql-server-2008

大家好我有一个表TableC,可以保存来自两个不同表TableATableB的主键值。因为它们是来自两个表的主键,所以我最终可以在tableC中使用重复项。因此,当存储值时,我使用短文本作为主键的前缀,以区分哪个值来自哪个表。

现在,我想与tableCTableA加入TableB,以便从tableATableB

获取数据
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)

这将返回两个表中的数据,我希望在ID_Column最后有B时从表b返回数据,并希望在tableA时从ID_Column返回数据最后有A

提前谢谢。

2 个答案:

答案 0 :(得分: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让你尝试。

答案 1 :(得分: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'