每个表中的外部联接和唯一记录

时间:2018-06-28 01:33:54

标签: sql

TableA
------
IntId   EvId    Name    Phone1
=====   ====    ====    ======
100     aaa     xxx     11111
101     bbb     yyy     22222
102     ccc     zzz     33333
103     bbb     asd     44444
104     bbb     sdf     55555


TableB
------
IntId   ASId    Grp     Phone2
=====   ====    ====    ======
201     bbb     yyy     6666
202     ccc     zzz     7777
203     bbb     asd     8888
204     bbb     kkf     9999
205     ddd     esd     0000
206     eee     ffr     1001

我想使用TableA.EvId = TableB.ASId将TableA与TableB联接以输出{IndId, EvId, Name, Phone1, Grp, Phone2}(使用外部联接,因为我希望TableA中的所有记录都具有匹配的TableB列) 我可以使用下面的查询来做到这一点,但是由于EvId和ASId具有重复项,因此它给了我重复项。

SELECT a.IntId, a.EvId, a.Name, a.Phone1, b.Grp, b.Phone2
    FROM TableA a
    LEFT OUTER JOIN TableB b
    ON a.EvId = b.ASId

如果EvId是重复的,请考虑具有最大IntId的记录。 TableB的相同规则

我的最终输出应该是这样-TableA中所有唯一的EvId都使用B上的externaljoin

IntId   EvId    Name    Phone1      Phone2      Grp
100     aaa     xxx     11111       null        null
104     bbb     sdf     55555       9999        kkf
102     ccc     zzz     33333       7777        zzz

您能帮我查询吗?

1 个答案:

答案 0 :(得分:2)

您可以使用ROW_NUMBER()

SELECT a.IntId, a.EvId, a.Name, a.Phone1, b.Grp, b.Phone2
FROM TableA a LEFT OUTER JOIN
     (SELECT b.*,
             ROW_NUMBER() OVER (PARTITION BY ASId ORDER BY IntID DESC) as seqnum
      FROM TableB b
     ) b
    ON a.EvId = b.ASId AND b.seqnum = 1;