将具有不同设计的多个详细信息表连接到主表

时间:2013-11-26 12:59:27

标签: sql sql-server oracle select

TABLE_MASTER
  ID Value
---- ----------
   1 MasterValue_1
   2 MasterValue_2

TABLE_DETAIL1
  ID MASTERID Value       DATE
---- -------- ----------- --------
   1 1        SubValue1_1 01.01.2014
   2 1        SubValue1_2 01.01.2014

TABLE_DETAIL2
  ID MASTERID ValueX      DATE
---- -------- ----------- --------
   3 1        SubValue2_1 01.01.2014
   4 1        SubValue2_2 01.01.2013

现在,我想在一个选择中确定详细信息表格和列 ValueX 但我需要知道选择了哪个细节

采样选择:

SELECT * FROM TABLE_MASTER n
INNER JOIN TABLE_DETAIL1 d1 ON d1.ID = m.ID
INNER JOIN TABLE_DETAIL2 d2 ON d2.ID = m.ID
WHERE d1.DATE >= GETDATE() OR d2.DATE >= GETDATE()

结果是这样的:

  ID Value           ID MASTERID Value       DATE       ID MASTERID ValueX      DATE
---- ------------- ---- -------- ----------- -------- ---- -------- ----------- --------
   1 MasterValue_1  1   1        SubValue1_1 01.01.2014  3 1        SubValue2_1 01.01.2014
   ***
   ***

我需要类似 CASE WHICH JOIN 左右的东西

  ID Value         DETAILID Value       DATE    
---- ------------- -------- ----------- -------- 
   1 MasterValue_1     1    SubValue1_1 01.01.2014
   1 MasterValue_1     2    SubValue1_2 01.01.2014
   1 MasterValue_1     3    SubValue2_1 01.01.2014

最好的解决方案是我可以在mssql和oracle

上使用的解决方案

2 个答案:

答案 0 :(得分:2)

这应该适用于Oracle和SQL Server(尽管您需要包含一些使用具有正确列标识符的关键字的列名称):

SELECT  M.ID,
        M.Value,
        D.ID DETAILID,
        D.Value DetailValue,
        D.Date
FROM TABLE_MASTER M
LEFT JOIN ( SELECT *
            FROM TABLE_DETAIL1
            UNION ALL
            SELECT *
            FROM TABLE_DETAIL2) D
    ON M.ID = D.MASTER_ID

答案 1 :(得分:1)

这适用于SQl Server,我知道UNION ALL是SQL标准的一部分,因此关闭的东西应该适用于Oracle。注意 - 可能我做了一些小的语法错误,因为我实际上没有这些表可以使用,但这是个主意。

SELECT m.ID, m.Value.d1.ID as DetailID,d1.Value as DetailValue,d1.DATE as DATE
FROM TABLE_MASTER m
INNER JOIN TABLE_DETAIL1 d1 ON m.ID = d1.ID
UNION ALL
SELECT m.ID, m.Value.d2.ID as DetailID,d2.ValueX as DetailValue,d2.DATE as DATE
FROM TABLE_MASTER m
INNER JOIN TABLE_DETAIL2 d2 ON m.ID = d2.ID