SQL(server 2008)从不同的表中检索(不同的)数据(存储在新表的列中)

时间:2015-07-02 15:04:55

标签: sql sql-server subquery dynamic-sql information-schema

这是问题所在。我有几张桌子里面有油井数据。他们中的大多数(不是全部)都有一个UWI - 它代表Unique Well Identifier-和WELL_NAME列。我设法使用一个查询,让我知道哪些表有UWI和WELL_NAME列(使用INFORMATION_SCHEMA)。我把它保存为新表(UWITABLES)。棘手的部分(对我来说)一直是从我从INFORMATION_SCHEMA查询中获得的所有表中获得一个“主”表(UWI和Well Names)。 我已经尝试了Union方法,但说实话,我得到的表列表有足够的表来让我寻找一种不同的方法(希望利用我得到的表列表)。

整体情况如下:

  • 我需要一个包含以下列的表:
********************************************
*   UWI    |    WELL_NAME   |  TEST_NUMBER *
********************************************
*  005     |      Well 1    |      1       *
********************************************
*  005     |      Well 1    |      2       *
********************************************
*  005     |      Well 1    |      3       *
********************************************
*  007     |      Well 3    |      1       *
********************************************
*  007     |      Well 3    |      2       *
********************************************

UWI,Well名称以及该条目所源自的表格。

  • 有些表有重复的UWI和Well Names(有些井在不同的深度间隔进行测试,因此对于这些“测试”表,我将重复使用UWI和Well Names)。因此,我需要在表级获得一个没有重复的井列表:

TABLE_A:

********************************************
*   UWI    |    WELL_NAME   |  PROD_OIL    *
********************************************
*  005     |      Well 1    |      52131   *
********************************************
*  006     |      Well 2    |      54364   *
********************************************
*  008     |      Well 4    |      34538   *
********************************************
*  009     |      Well 5    |      1886    *
********************************************

表-B:

*********************************
*  UWI  |  WELL_NAME  |  TABLE  *
*********************************
*  005  |    Well 1   | TABLE_A *
*********************************
*  005  |    Well 1   | TABLE_B *
*********************************
*  006  |    Well 2   | TABLE_B *
*********************************
*  007  |    Well 3   | TABLE_A *
*********************************
*  008  |    Well 4   | TABLE_B *
*********************************
*  009  |    Well 5   | TABLE_B *
*********************************

结果表:

WHERE RouterCallKey IN
    (
    SELECT RouterCallKey
    FROM Termination_Call_Detail
    WHERE DateTime > CONVERT(DATE,GETDATE())
    )

UWI的订单不是必须的,只是想把它放在这样,所以它不那么凌乱。如果可能的话,我希望从您的专业知识中受益,并获得有关如何构建查询的简短而简单的解释。如果一个简单的答案是可能的,我会很感激。我刚刚开始。提前全部感谢!

-Mike

2 个答案:

答案 0 :(得分:0)

尝试此查询

select uwi,well_name,'Table1' as table
from table1
Group by Uwi,Well_name
Union all
select uwi,well_name,'Table2' as table
from table2
Group by Uwi,Well_name

select distinct uwi,well_name,'Table1' as table
    from table1    
    Union all
    select distinct uwi,well_name,'Table2' as table
    from table2

答案 1 :(得分:0)

联盟应该为你工作。如果你有一个包含所需表名的表,你可以构建一个这样的动态查询。

DECLARE @Sql VARCHAR(MAX)
SELECT @Sql = COALESCE(@Sql + ' UNION ', '') 
    + 'SELECT UWI, WELL_NAME,' + [TableName] + ' AS [Table] FROM ' + [TableName]
FROM UWITABLES

EXEC (@Sql)

UNION会给你DISTINCT UWI, WELL_NAME, TABLE