2016-01-29 106 views
1

您好(我希望对不起我的英文不好,在开始)数据选择表名,选择从

我有两个表:tbl1tbl2;两者具有相同的结构,但是如果来自不同来源的数据集,我不能混合它们。

在另一个表tbl3我有dataiddatasource。 我想要做的是从源链接表中选择数据。

伪我尝试生产:

SELECT 
    tbl3.dataid, 
    tbl3.datasource, 
    SEL_TBL.important_data, 
    SEL_TBL.another_thing, 
    SEL_TBL.something_completly_different 
FROM 
    tbl3 
LEFT JOIN 
    (SWITCH tbl3.datasource 
     CASE 'tbl1': 
      tbl1 AS >> SEL_TBL 
     CASE 'tbl2': 
      tbl2 AS >> SEL_TBL 
    ) 
ON 
    SEL_TBL.dataid = tbl3.dataid 

我需要的结果,其中包含:important_dataanother_thing当然something_completly_different从 “switch叙述” 选择表。

什么现在的工作:

SELECT 
    tbl3.dataid, 
    tbl3.datasource, 
    (
CASE 
    WHEN tbl3.datasource ='tbl1' 
    THEN 
     tbl1.important_data 
    ELSE 
     tbl2.important_data 
    END 
    ) important_data 
FROM 
    tbl3 
LEFT JOIN 
    tbl2 
ON 
    tbl2.dataid = tbl3.dataid 
LEFT JOIN 
    tbl1 
ON 
    tbl1.dataid = tbl3.dataid 

在此查询我得到dataiddatasourceimporatn_data的结果。我可以为每一个领域重复整个案例块,但也许还有更文明的方法。

哦还有一两件事:tbl1.dataid和tbl2.dataid可以得到相同的值(这就是为什么我不能混用表)

回答

2

最好的解决方法是使用一个左连接和包括加入要求。
然后coalesce为您提供每个领域的结果。
由于这是星型数据模型的标准做法,SQL优化器将使其运行速度非常快。

SELECT 
    tbl3.dataid, 
    tbl3.datasource, 
    COALESCE(tbl1.important_data, tbl2.important_data) important_data 
    COALESCE(tbl1.another_thing, tbl2.another_thing) another_thing, 
    COALESCE(tbl1.something_completly_different, tbl2.something_completly_different) something_completly_different 
FROM tbl3 
LEFT JOIN tbl2 ON tbl2.dataid = tbl3.dataid AND tbl3.datasource = 'tbl2' 
LEFT JOIN tbl1 ON tbl1.dataid = tbl3.dataid AND tbl3.datasource = 'tbl1' 
+0

如果我认为正确'COALESCE'会给我第一个NOT NULL值。如果没有给出'datasource',我会得到NULL。它仍然有很多代码可以编写,但更具可读性,应该在我免除时运行。需要/值得去尝试,谢谢:) – Anielka

+0

@Anielka - 你的欢迎,祝你好运 – Hogan