【问题标题】:Select datas from multiple tables using one common table in sql server 2005使用sql server 2005中的一个公用表从多个表中选择数据
【发布时间】:2013-07-25 06:38:53
【问题描述】:

我有许多表和一个公共表,其中包含所有这些表的 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

【问题讨论】:

    标签: sql sql-server-2005 select


    【解决方案1】:

    如果您不想使用UNION ALL,您可以使用COALESCE,同样使用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;
    

    this SQLFiddle

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

    【讨论】:

      【解决方案2】:

      您可以UNION ALL在进程中添加标志列的表,然后将结果与普通表JOIN。

      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

      【讨论】:

        【解决方案3】:

        您需要分别使用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

        【讨论】:

        • 我已经在使用的所有联合体......我需要任何其他简单的解决方案,因为如果表是 10 或 20,那么这个 union all 将很难使用这就是为什么
        • @Suresh - 那么你真的需要看看你的数据结构。在其他表中添加表名并加入它们是不理想的。此外,您不需要为每种类型的记录添加表格,而是添加一列来分隔它们。
        • @Suresh - 见my alternative answer
        猜你喜欢
        • 2012-08-15
        • 1970-01-01
        • 1970-01-01
        • 2012-01-07
        • 2022-12-09
        • 2012-12-22
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        相关资源
        最近更新 更多