Sql 完全外接

Sql 完全外接,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,我有以下情况(表架构:ID、名字、姓氏、值): 表1: ID | first name | last name | value -------------------------------------- 1 | John | Goodman | 5 2 | Peter | Snow | 6 3 | Mike | Walker | 7 4 | John | Goodman | 8 表2:

我有以下情况(表架构:
ID、名字、姓氏、值
):

表1

ID | first name  | last name  | value
--------------------------------------
1  |    John     | Goodman    |  5
2  |    Peter    | Snow       |  6
3  |    Mike     | Walker     |  7
4  |    John     | Goodman    |  8
表2

ID | first name  | last name  | value
--------------------------------------
1  |  Peter      | Snow       | 2
2  |  Bobby      | White      | 1
3  |  Mike       | Walker     | 1
4  |  Brad       | West       | 2
5  |  Peter      | Snow       | 3
我想编写完整的外部联接以获得第4列的总和,但每个名称在结果(联接)表中只能放置一次,如下所示:

结果表:

ID | first name  | last name  | value.table1 | value.table2 
-----------------------------------------------------------
1  |  John       | Goodman    | 5            | 0
2  |  Peter      | Snow       | 6            | 5
3  |  Mike       | Walker     | 7            | 1
4  |  Bobby      | White      | 0            | 1
5  |  Brad       | West       | 0            | 2
我如何才能做到这一点?

试试这个:

With s as (Select firstname, lastname , value
From table1
Union all
Select firstname, lastname , value
From table2)
Select firstname, lastname , sum(value)
From s
Group by firstname , lastname
SELECT COALESCE(T1.FName,T2.FName) as FName,COALESCE(T1.LName,T2.LName) as LName,ISNULL(T1.Value,0) as Value1,ISNULL(T2.Value,0) as Value2 
FROM Table1 T1 FULL OUTER JOIN
     Table2 T2 ON T1.FName=T2.FName AND T1.LName=T2.LName
说明:

COALESCE
返回列表中第一个非
NULL
的值

ISNULL
用于将
NULL
值替换为0。 结果:

请参阅中的结果

结果


这是mySQL的工作解决方案,忽略ID列:

SELECT FirstName, 
       LastName, 
       SUM(tot1) 
FROM   (SELECT FirstName, 
               LastName, 
               sum(value) as tot1
        FROM   table1
        GROUP BY  FirstName, 
                  LastName
        UNION  SELECT FirstName, 
               LastName, 
               sum(value)
        FROM   table2
        GROUP BY  FirstName, 
                  LastName) t
GROUP BY  FirstName, 
          LastName

类似的方法应该可以工作(如果我现在忽略
ID
列):


为什么约翰,古德曼在结果中有两个记录??。。。彼得·斯诺不应该总共11个吗?我修正了我的问题。很抱歉,我将其重新表述了一点,因为我需要两个表中的值。结果中是否需要
ID
?当两个表中的原始
ID
s不匹配时,如何计算?您的表与结果之间仍然存在一些差异,例如,John Goodman在表1中总共有13个ID,以及前面提到的ID(在结果表中)。您想对结果集进行排序吗?按什么排序?在期待一个好的、有效的解决方案之前,试着回答这些问题。我重新表述了我的问题,实际上,我需要两列。@Milan:但是John Goodman在表1中有5和8,结果中有5和0???@Milan:编辑了我的答案。
Declare @table1 Table (ID int, firstname varchar(30), lastname varchar(30), value int)
Declare @table2 Table (ID int, firstname varchar(30), lastname varchar(30), value int)
Insert into @table1 values 
(1,'John', 'Goodman', 5 ),
(2,'Peter', 'Snow', 6   ),
(3,'Mike', 'Walker', 7  ),
(4,'John', 'Goodman', 8 )

Insert into @table2 values 

(1, 'Peter', 'Snow', 2 ),
(2, 'Bobby', 'White', 1),
(3, 'Mike', 'Walker', 1),
(4, 'Brad', 'West', 2  ),
(5, 'Peter', 'Snow', 3 )

Select  A.*,
        ISNULL(B.value,0) [value.t1],
        ISNULL(C.value,0) [value.t2]
From    (
Select  row_number() over (order by firstname) id,*
From    (
        Select firstname,lastname from @table1
        union all
        Select firstname,lastname from @table2
        ) Lu
group   by firstname,lastname) A
Left Join (Select firstname,lastname,Min(value) value From @table1 Group By firstname,lastname) B On A.firstname = B.firstname And A.lastname = B.lastname
Left Join (Select firstname,lastname,Sum(value) value From @table2 Group By firstname,lastname) C On A.firstname = C.firstname And A.lastname = C.lastname
SELECT FirstName, 
       LastName, 
       SUM(tot1) 
FROM   (SELECT FirstName, 
               LastName, 
               sum(value) as tot1
        FROM   table1
        GROUP BY  FirstName, 
                  LastName
        UNION  SELECT FirstName, 
               LastName, 
               sum(value)
        FROM   table2
        GROUP BY  FirstName, 
                  LastName) t
GROUP BY  FirstName, 
          LastName
SELECT
    COALESCE(t1.FirstName,t2.FirstName) as FirstName,
    COALESCE(t1.LastName,t2.LastName) as LastName,
    COALESCE(t1.value,0) as t1value,
    COALESCE(t2.value,0) as t2value
FROM
    (select FirstName,LastName,SUM(value) as value
     from table1
     group by FirstName,LastName) t1
        full outer join
    (select FirstName,LastName,SUM(value) as value
     from table2
     group by FirstName,LastName) t2
        on
            t1.FirstName= t2.FirstName and
            t1.LastName=  t2.LastName