根据列值链接表

时间:2013-07-19 15:57:07

标签: sql sql-server-2008

是否可以根据列的值从2个不同的表中提取值?例如,我有一个带有布尔列的表,该列返回0或1,具体取决于最终用户在程序中选择的内容。 0表示我应该拉入默认值。 1表示使用用户的数据。

如果我的表Table1看起来像这样:

Case ID      Boolean
====================
    1              0
    2              1
    3              1
    4              0
    5              0

然后我需要从表Default中提取案例ID 1,4和5的相应数据,并从表UserDef中提取案例ID 3和4的相应数据。然后我将不得不采用这些值,组合它们,并按Case ID重新排序,以便我可以保留结果表中的顺序。

我对SQL很缺乏经验,但我正在努力学习。非常感谢任何帮助或建议。提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这样的事情:

SELECT 
  t1.CaseID
 ,CASE WHEN t1.Boolean = 1 THEN dt.Col1 ELSE ut.Col1 END AS Col1
 ,CASE WHEN t1.Boolean = 1 THEN dt.Col2 ELSE ut.Col2 END AS Col2 
FROM Table1 t1
LEFT JOIN DefaultTable dt ON dt.CaseID = t1.CaseID
LEFT JOIN UserDefTable ut ON ut.CaseID = t1.CaseID
ORDER BY t1.CaseID

您加入这两个表,然后使用CASE中的SELECT选择显示数据的那个。

选项B:

WITH CTE_Combo AS
(
   SELECT 0 as Boolean, * FROM Default     --replace * with needed columns
   UNION ALL 
   SELECT 1 AS Boolean, * FROM UserDef     --replace * with needed columns
)
SELECT * FROM Table1 t
LEFT JOIN CTE_Combo c ON t.CaseID = c.CaseID AND t.Boolean = c.Boolean
ORDER BY t.CaseID

这可能更简单 - 使用CTE创建两个表的联合添加人工列,然后使用ID和标志列加入CTE和您的表。

答案 1 :(得分:1)

SELECT t1.CaseID, 
       ISNULL(td.data, tu.data) userData -- pick data from table_default
                                         -- if not null else from table_user
  FROM table1 t1
  LEFT JOIN table_default td ON t1.CaseID = td.CaseID -- left join with table_default
                            AND t1.Boolean = 0        -- when boolean = 0
  LEFT JOIN table_user tu ON t1.CaseID = tu.CaseID -- left join with table_user
                         AND t1.Boolean = 1        -- when boolean = 1
  ORDER BY t1.CaseID