我有两个表TableA和TableB以及一些数据:
IDA|TDATA IDB|TDATA
---+----- ---+-----
1 | A1 1 | B1
2 | A2 2 | B2
和一个中央表:
ID|TID|TAB|CDATA
--+---+---+-----
10| 1 | A | C1
11| 2 | B | C2
12| 2 | A | C3
来自中心表的数据应该与来自TableA或TableB的数据(连接列TID和TAB)连接。 TID是对连接表IDA或IDB中的ID的引用,而列TAB定义了应该连接的表。所以查询的最终结果应如下所示:
ID|TDATA|CDATA
--+-----+-----
10| A1 | C1
11| B2 | C2
13| A2 | C3
这个SQL查询应该如何?
答案 0 :(得分:1)
您可以执行类似
的操作SELECT c.id,
coalesce( a.tdata, b.tdata ) tdata,
c.cdata
FROM central_table c
LEFT OUTER JOIN tableA a
ON( c.tid = a.ida AND
c.tab = 'A' )
LEFT OUTER JOIN tableB b
ON( c.tid = b.idb AND
c.tab = 'B' )
然而,我会严肃地质疑这里的数据模型。如果您不知道C中的列是否引用A或B中的列,则数据模型中的某些内容通常是不正确的。修复数据模型将使这(以及所有其他查询,更有可能)更容易编写,更容易优化。
答案 1 :(得分:0)
如果您想要的只是TAB,然后是TID,那么以下内容将起作用:
SELECT ID, CONCAT(TAB, CAST(TID AS CHAR[2])) AS TDATA, CDATA FROM CentralTable;
如果表名是常数(例如,除了A或B之外没有其他内容),那么你可以这样做:
(SELECT ID, TDATA, CDATA FROM CentralTable a
JOIN TableA b ON (a.ID = b.IDA) WHERE a.TAB = 'A')
UNION ALL
(SELECT ID, TDATA, CDATA FROM CentralTable a
JOIN TableB b ON (a.ID = b.IDB) WHERE a.TAB = 'B')