SQL Server - 内部和外部连接在一起

时间:2016-01-21 10:20:36

标签: sql sql-server inner-join outer-join

在编写SQL Server的SQL查询时需要一些帮助。我有三个表格的跟随数据模型

表1

Seq   ID   Name
1    1234   Abc
2    4567   Pqr
3    7890   Xyz

表2

Seq Table1Id Table3Seq
1    1234       1
2    1234       2
3    7890       3

表3

Seq  Status
1    Rejected
2    Accepted
3    Pending

我的要求如下。我希望表1中的所有记录都具有表3中的最新状态(如果存在)。因此,正如我们可以看到Id 1234,表3中有两条记录匹配(通过表2),但是我想要最新的接受。但是表1 4567中有一条记录,表2中没有任何记录,所以我可以在状态显示为空。

Number    Name     Status
1234      Abc      Accepted
4567      Pqr      
7890      Xyz      Pending 

我想,我们可能需要一起使用Outer和Inner连接,但到目前为止我无法找到正确的查询。当我尝试使用MAX使用外连接时,它仍然给我两条针对1234的记录,当我使用内连接时,我在输出中没有得到记录4567

3 个答案:

答案 0 :(得分:2)

select a.ID, a.Name, c.Status
from table1 a
left outer join (select max(b.seq) AS SEQ, b.table1id from table2 b group by b.table1id) t2 on a.id = t2.table1id
left outer join table2 t2b on t2.seq = t2b.seq and t2.table1id = t2b.table1id
left outer join table3 c on t2b.table3seq = c.seq

可能有更有效的方法,但这将为您提供您所追求的结果。基本上将表1连接到表2的子集,获取每个记录的最大序列,然后再次连接到table2以获取到表3的链接,然后连接到table3以获取状态。

所有连接都保留在外部,因此您的pqr结果将返回null状态。

答案 1 :(得分:0)

使用两个连接:

SELECT Number, Name, Status FROM
        (SELECT Table1.ID AS Number, Table1.Name, Table3.Status, 
        ROW_NUMBER() OVER (PARTITION BY Table1.Number ORDER BY table3.Seq DESC) AS RN
        FROM Table1
        LEFT OUTER JOIN Table2 ON Table1.ID=Table2.Table1ID
        LEFT OUTER JOIN Table3 ON Table3.seq=table2.Table3Seq)MyTable
        WHERE MyTable.RN=1

答案 2 :(得分:0)

在SQL Server中执行此操作的一种方法是使用outer apply。这种方法通常具有最佳性能:

select t1.*, t3.status
from table1 t1 outer apply
     (select top 1 t3.*
      from table2 t2 join
           table3 t3
           on t2.table3seq = t3.seq
      where t1.id = t2.table1id
      order by t2.id desc
     ) t3;

相应的索引为table2(table1id, table3seq, id)table3(seq, status)