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
上使用的解决方案答案 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