需要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
但是似乎没有通过。
感谢您的帮助。
答案 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 = ?