使用sql server 2005中的一个公用表从多个表中选择数据

时间:2013-07-25 11:33:55

标签: sql sql-server-2005 select

我有很多表和一个包含所有这些表的id的公共表 例如:

表1

| ID | VALUE |       DATE |
---------------------------
|  1 |   200 | 25/04/2013 |
|  2 |   250 | 26/05/2013 |

表2

| ID | VALUE |       DATE |
---------------------------
|  1 |   300 | 25/05/2013 |
|  2 |   100 | 12/02/2013 |

表3

| ID | VALUE |       DATE |
---------------------------
|  1 |   500 | 5/04/2013  |
|  2 |   100 | 1/01/2013  |

和一个公用表

| ID |  TABLE | TABLEID |
-------------------------
|  1 | table1 |       1 |
|  2 | table3 |       1 |
|  3 | table2 |       1 |
|  4 | table1 |       2 |
|  5 | table2 |       2 |
|  6 | table3 |       2 |

并使用这个公共表我需要选择上面3个表中的所有数据 例如:

output
id    table   tableid   value    date
1     table1  1         200      25/04/2013
2     table3  1         500      5/04/2013
3     table2  1         300      25/05/2013
4     table1  2         250      26/05/2013
5     table2  2         100      12/02/2013
6     table3  2         100      1/01/2013

3 个答案:

答案 0 :(得分:1)

如果您不想使用UNION ALL,可以LEFT JOIN使用SELECT c.* , COALESCE(t1.Value, t2.Value,t3.Value) AS Value , COALESCE(t1.Date, t2.Date,t3.Date) AS Date FROM Common c LEFT JOIN Table1 t1 ON c.tableid = t1.[id] AND [Table] = 'table1' LEFT JOIN Table2 t2 ON c.tableid = t2.[id] AND [Table] = 'table2' LEFT JOIN Table2 t3 ON c.tableid = t3.[id] AND [Table] = 'table3' ORDER BY ID; 使用UNION ALL,如下所示:

{{1}}

请参阅COALESCE

通过这种方式,您可以使用{{1}}减少加入所有记录的任务。但是对于给定的数据结构,无论如何都必须加入所有表。

答案 1 :(得分:0)

您需要分别使用common表加入所有表,然后使用UNION ALL加入它们:

SELECT *
  FROM Common c
  JOIN Table1 t1 ON c.tableid = t1.[id]
   AND [Table] = 'table1'
UNION ALL
SELECT *
  FROM Common c
  JOIN Table2 t2 ON c.tableid = t2.[id]
   AND [Table] = 'table2'
UNION ALL
SELECT *
  FROM Common c
  JOIN Table3 t3 ON c.tableid = t3.[id]
   AND [Table] = 'table3';

请参阅this SQLFiddle

答案 2 :(得分:0)

您可以UNION ALL在过程中添加标志列的表格,然后使用公共表格加入结果。

WITH CTE_Tables AS 
(
   SELECT 'Table1' AS Tab, * FROM Table1
   UNION ALL
   SELECT 'Table2' AS Tab, * FROM Table2
   UNION ALL
   SELECT 'Table3' AS Tab, * FROM Table3
)
SELECT * 
FROM CommonTable c1 
LEFT JOIN CTE_Tables cte ON cte.ID = c1.TableID AND cte.Tab = c1.[Table]

<强> SQLFiddle DEMO