如果使用join有多个记录,如何获取一条记录

时间:2013-12-12 07:58:34

标签: sql oracle11g

需要sql查询的帮助才能从下面的表结构中获取记录:

Table A:
trans_id  msgid recivtime 
1          p      dd-mm-yyyy hh24i mi:ss
1          Q      dd-mm-yyyy hh24i mi:ss


Table B:
msgid      status  sendtime 
P           C       dd-mm-yyyy hh24i mi:ss
P           -        -
Q           C       dd-mm-yyyy hh24i mi:ss

我想从表A中获取一个trans_id,从表B中获取状态详细信息(仅来自上例中的第一个记录),因此输出应该是

transid   msgid status sendtime
1         P      C      dd-mm-yyyy
1         Q      C      dd-mm-yyyy

我试过

SELECT a.msgid, 
       a.recivtime, 
       b.status 
FROM   a a, 
       b b 
WHERE  a.msgid = b.msgid 
       AND a.transid = ? 

它给出了表B中的重复记录,删除我尝试distinct但是似乎没有通过。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

为此我假设你想解决某种“从tableb获取特定msgid的最新条目”-problem与1:n的关系(一个table_a.msgid连接到multipble table_b.msgid记录) :


我用三个视图来完成这个。每条记录必须有一个主键,只是一个数值。使用msgid是不够的。首先,我使用最高的“id”-Values(这是我的主要列,只是一个增长值)从table_b为每个msgid选择“最新”记录ID。这背后的想法是“table_b中的最新条目(对于每个msgid)具有最高的主键:

create view table_b_max as 
select msgid, max(id) from tableb
group by msgid

然后我使用这个“max”-view(只包含msgid和最高的相应id)来选择完整的记录:

create view table_b_max_full
select b.* from table_b b, table_b_max b_max
where b.id = b_max.max_id and 
      b.msgid = b_max.msg_id

之后我加入table_a和table_b_max_full

create view table_a_b   
    select a.*, b.* from table_a a, table_b_max_full b
    where a.msgid = b.msgid (+)

现在您可以使用msgid访问table_a_b的“最新”状态。

select * from table_a_b where msgid = ?

答案 1 :(得分:0)

如果我理解正确,那么{transid, msgid}是表A中的关键,这意味着对于每个transid,都会有一个或多个msgid。对于每个msgid,表B中将有一个或多个详细记录。您说表B中没有密钥,但您仍然可以找到自然密钥,例如{msgid, sendtime}。< / p>

以下查询将为您提供表B中具有最高发送时间的记录。 如果这是你想要的,请告诉我。

select a.msgid
      ,a.recivtime
      ,b.status
  from table_a
  join table_b on(
       b.msgid = a.msgid
  )
 where b.sendtime = (
         select max(b.sendtime)
           from table_b x
          where x.msgid = a.msgid
       )
   and a.transid = ?