全外连接

时间:2014-05-28 06:41:03

标签: sql sql-server database tsql

我遇到以下情况(表格架构:ID, first name, last name, value)。:

table 1

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

table 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

我怎样才能做到这一点?

5 个答案:

答案 0 :(得分:4)

这样的事情应该有效(如果我现在忽略ID列):

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

试试这个:

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。 结果:

FNAME   LNAME   VALUE1  VALUE2
John    Goodman 5       0
Peter   Snow    6       2
Peter   Snow    6       3
Mike    Walker  7       1
John    Goodman 8       0
Bobby   White   0       1
Brad    West    0       2

请参阅SQL Fiddle中的结果。

答案 3 :(得分:1)

这是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

答案 4 :(得分:0)

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

<强>结果

enter image description here