如何选择没有union和union all的两个表?

时间:2016-06-22 05:12:27

标签: sql sql-server

表1:

Id  | Text      | Parent Id | Number
**************************************
101 |robber     | 201       | 1
102 |devel      | 202       |  1
103 |programmer | 203       | 3


Table 2     
Id  | TO id     | Parent Id | Number
**************************************
102 |355        | 201       | 1
104 |366        | 202       |  2
105 |377        | 203       | Null

我需要在不使用Unionunion All

的情况下加入两个表格

Out Put Like: (两个表列都相同,期望列添加到最后一个到的Id)

Id  |   Text    | Parent Id |  Number | To Id
101 |robber     | 201       |  1      |  Null
102 |devel      |  202      | 2       | null
103 |programmer |  203      |  3      |Null
102 |Null       | 201       |  1      |355
104 | Null      |   202     |  2      | 366
105 |Null       |    203     |  null  | 377

3 个答案:

答案 0 :(得分:2)

尝试完整联合

select isnull(a.id,b.id) as id, 
    a.Text1,isnull(a.ParentId,b.ParentId) parentid,
    isnull(a.Number,b.Number) numm,TOid 
 from @t a 

 full join @t1 b on a.Id=b.Id and a.ParentId=b.ParentId

数据

declare @t table (Id int,Text1 varchar(50),ParentId int, Number int) insert into @t
(Id,Text1,ParentId, Number) values
(101 ,'robber'     , 201       , 1),
(102 ,'devel'      , 202       ,  1),
(103 ,'programmer' , 203       , 3)

declare @t1 table (Id int,TOid int,ParentId int, Number int) insert into @t1
(Id,TOid,ParentId, Number) values
(102 ,355        , 201       , 1),
(104 ,366        , 202       ,  2),
(105 ,377        , 203       , Null)

答案 1 :(得分:1)

并且对于非联合方式,您可以使用临时表,如下所示

IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL
    BEGIN
        DROP TABLE #TempTable
    END

CREATE TABLE #TempTable (
    Id INT
    ,[Text] VARCHAR(20)
    ,ParentId INT
    ,Number INT
    ,ToId INT
)

INSERT INTO #TempTable (Id, [Text], ParentId, Number)
SELECT
    Id
    ,[Text]
    ,ParentId
    ,Number
FROM
    TableNameA

INSERT INTO #TempTable (Id, ToId, ParentId, Number)
SELECT
    Id
    ,ToId
    ,ParentId
    ,Number
FROM
    TableNameB


SELECT *
FROM
    #TempTable

我只会在这种情况下使用这种方式,我肯定想要一个结果的临时表,或者我的逻辑由于某种原因必须被分解,后来非常罕见。还有其他方法,但如果你没有使用临时表联合,那么所有方法都应该比其他方式更好。

答案 2 :(得分:0)

select t.ID, t.Text, t.ParentID, t.Number, cast(NULL as int) as TO_ID
from Table1

union all

select t.ID,  NULL as Text, t.ParentID, t.Number, t.To_ID
from Table2 t

现在没有"错误"。