用于加入一个或另一个表的SQL查询

时间:2014-08-13 22:37:33

标签: mysql sql

我有两个表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查询应该如何?

2 个答案:

答案 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')