大家好我有一个表TableC
,可以保存来自两个不同表TableA
和TableB
的主键值。因为它们是来自两个表的主键,所以我最终可以在tableC
中使用重复项。因此,当存储值时,我使用短文本作为主键的前缀,以区分哪个值来自哪个表。
现在,我想与tableC
和TableA
加入TableB
,以便从tableA
和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)
这将返回两个表中的数据,我希望在ID_Column
最后有B
时从表b返回数据,并希望在tableA
时从ID_Column
返回数据最后有A
提前谢谢。
答案 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'