合并包含重复项的2个表

时间:2013-08-28 00:41:07

标签: sql sql-server

我这里有2张桌子

表r

    id        |add       |jid  |sid|cocode
    ------------------------------------------
    0234567890|PO BOX 456|p123a|2  |TRAVEL2000
    0234567890|PO BOX 789|q456b|4  |TRAVEL2000
    0234567890|PO BOX 123|r789c|1  |TRAVEL2000

表o

    jid  |pkey      |tid|date      |cid
    ---------------------------------
    q334a|0234567890|1  |15/08/2013|200

我想创建一个新表,包括表o和表r的合并,目的是通过使用id = pkey获取tid,date和cid信息,我希望cocode是唯一的。问题是我无法使用jid进行匹配以选择哪条记录作为输出,因为它们可能与上面显示的示例不同。所以我想通过使用升序来获取最新的jid(在本例中为r789c)。我的预期结果表将是:

    id        |add       |jid  |sid|cocode    |tid|date      |cid
    -------------------------------------------------------------
    0234567890|PO BOX 123|r789c|1  |TRAVEL2000|1  |15/08/2013|200

我正在使用SQL Server 2008,我们非常感谢任何解决方案。感谢。

2 个答案:

答案 0 :(得分:1)

听起来你想加入r(基于jid)的最后一条记录和来自o的相应记录。如果是这样,那么以下查询将执行您想要的操作:

select r.id, r.add, r.jid, r.sid, r.cocode, o.tid, o.date, o.cid
from (select r.*, row_number() over (partition by id order by jid desc) as seqnum
      from r
     ) r join
     o
     on r.id = o.pkey and seqnum = 1;

答案 1 :(得分:0)

首先,创建相应的表来保存该数据。然后,将此查询的结果插入其中:

SELECT r1.*, o1.tid, o1.date, o1.cid FROM r r1
LEFT JOIN r r2 ON r1.id = r2.id AND r1.jid < r2.jid
JOIN o o1 ON r1.id = o1.pkey
WHERE r2.jid IS NULL

小提琴here

PS:请注意“最新的jid”我根据你的例子理解它实际上按字母顺序排序。