如何创建合并两个表的视图?

时间:2011-02-08 11:03:06

标签: sql view

我有两张表具有完全相同的结构。两个表都可以使用不同的主键(自动增量整数)存储相同的数据。因此,存在第三个表,其列出了哪两个主键列出了相同的数据。但是,也存在另一个不存在的行。因此,简单连接将不起作用,因为您将有两个具有相同主键但数据不同的行。因此,是否有一种方法可以将主键重新分配给视图中未使用的值?

表1

 ID    name
 1     Adam
 2     Mark
 3     David
 4     Jeremy

表2

 ID    name
 1     Jessica
 2     Jeremy
 3     David
 4     Mark

表3

 T1ID  T2ID
 2     4
 3     3
 4     2

我正在寻找如下结果表:

结果

 ID    name
 1     Adam
 2     Mark
 3     David
 4     Jeremy
 5     Jessica

问题的真正核心是我如何将临时假身份证5分配给杰西卡而不仅仅是一些随机数。我想要的id规则是,如果第一个表中存在该行,则使用自己的id。否则,使用insert语句将生成的下一个id(该列在autoincrement上)。

3 个答案:

答案 0 :(得分:2)

回答编辑过的问题

select id, name from table1
union all
select X.offset + row_number() over (order by id), name
from (select MAX(id) offset from table1) X
cross join table2
where not exists (select * from table3 where t2id = table2.id)

MAX(id)用于“预测”将第二个表中的数据合并到第一个表时将发生的下一个标识。如果Table3.T2ID完全存在,则意味着它已经包含在table1中。

使用下面的测试数据

create table table1 (id int identity, name varchar(10))
insert table1 select 'Adam' union all
select 'Mark' union all
select 'David' union all
select 'Jeremy'

create table table2 (id int identity, name varchar(10))
insert table2 select 'Jessica' union all
select 'Jeremy' union all
select 'David' union all
select 'Mark'

create table table3 (t1id int, t2id int)
insert table3 select 2,4 union all
select 3,3 union all
select 4,2

<小时/>

回答下面的原始问题

所以第3个表是你要构建的表(视图而不是表)?

select newid=row_number() over (order by pk_id), *
from
(
    select a.*
    from tblfirst a
    UNION ALL
    select b.*
    from tblsecond b
) X

数据将包含每个记录的唯一newid值,无论是来自第一个还是第二个表。将pk_id更改为您的主键列名称。

答案 1 :(得分:0)

如果我理解你的错误,可能会有以下工作

  1. 从第一张表中选择所有内容
  2. 从第二个表格中选择未链接到第三个表格的所有内容
  3. 合并结果
  4. 测试数据

    DECLARE @Table1 TABLE (ID INTEGER IDENTITY(1, 1), Value VARCHAR(32))
    DECLARE @Table2 TABLE (ID INTEGER IDENTITY(1, 1), Value VARCHAR(32))
    DECLARE @Table3 TABLE (T1ID INTEGER, T2ID INTEGER)
    
    
    INSERT INTO @Table1 VALUES ('Adam')
    INSERT INTO @Table1 VALUES ('Mark')
    INSERT INTO @Table1 VALUES ('David')
    INSERT INTO @Table1 VALUES ('Jeremy')
    
    INSERT INTO @Table2 VALUES ('Jessica')
    INSERT INTO @Table2 VALUES ('Jeremy')
    INSERT INTO @Table2 VALUES ('David')
    INSERT INTO @Table2 VALUES ('Mark')
    
    INSERT INTO @Table3 VALUES (2, 4)
    INSERT INTO @Table3 VALUES (3, 3)
    INSERT INTO @Table3 VALUES (4, 2)
    

    SQL声明

    SELECT  ROW_NUMBER() OVER (ORDER BY ID), t1.Value
    FROM    @Table1 t1
    UNION ALL 
    SELECT  ROW_NUMBER() OVER (ORDER BY ID) + offset, t2.Value
    FROM    @Table2 t2
            LEFT OUTER JOIN @Table3 t3 ON t3.T2ID = t2.ID
            CROSS APPLY (
              SELECT  Offset = COUNT(*)
              FROM    @Table1
            ) offset
    WHERE   t3.T2ID IS NULL   
    

答案 2 :(得分:0)

假设您有以下数据,我理解阅读您的问题:

Table: T1
ID  name
--------
1   a
2   b
3   c

Table: T2
ID  name
--------
2   b
3   c
4   d

Table: Rel
ID1  ID2
--------
2   2
3   3

T1有一些数据不在T2中,反之亦然。 以下查询将为所有数据联合提供

SELECT ROW_NUMBER() OVER (order by name) ID, Col
from 
(
SELECT ISNULL(T1.name,'') name
FROM T1 t1 LEFT JOIN Rel TR ON TR.ID1 = T1.ID
union
SELECT ISNULL(T2.name,'') name
FROM T2 t2 LEFT JOIN Rel TR ON TR.ID2 = T2.ID
) T