0

多くのテーブルと、これらすべてのテーブルの ID を持つ共通のテーブルが 1 つあります。

表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  |

および 1 つの共通テーブル

| 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
4

3 に答える 3

1

使用したくない場合は、次のように同じように使用UNION ALLできます。COALESCELEFT 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;

このSQLFiddleを参照してください

このようにして、 を使用してすべてのレコードを結合するタスクを減らすことができますUNION ALL。ただし、指定されたデータ構造では、とにかくすべてのテーブルを結合する必要があります。

于 2013-07-25T12:18:18.690 に答える
0

commonすべてのテーブルをtable で個別に結合してから、次を使用して結合する必要があります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';

このSQLFiddleを参照してください

于 2013-07-25T11:49:11.583 に答える
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 デモ

于 2013-07-25T12:12:01.847 に答える