通过消除重复来返回行的oracle sql查询
我对下面的情景感到震惊。需要您的帮助,根据以下示例数据修改我的查询。我的目标是使用TEM GT和TXN表中的可用数据创建事件和事件 temu GT(全局临时表)通过消除重复来返回行的oracle sql查询,sql,oracle11g,duplicates,Sql,Oracle11g,Duplicates,我对下面的情景感到震惊。需要您的帮助,根据以下示例数据修改我的查询。我的目标是使用TEM GT和TXN表中的可用数据创建事件和事件 temu GT(全局临时表) est_id primary key, trans_id, trp_id, amount 1 111 2221 1.5 2 111 3332 2.0 3 112
est_id primary key, trans_id, trp_id, amount
1 111 2221 1.5
2 111 3332 2.0
3 112 4443 3.0
TXN表格
trans_id, trans_type
111 type1
112 type1
事件表
event_id primary key, trans_id, trans_type, flag.
1000 111 type1 N
1001 112 type1 N
事件低表(最终表)
基于TEM_GT和TXN GT,将数据填充到事件表中。现在,当我尝试填充EVENT_LOW表中的数据时,上面的查询返回5行而不是3行。这是由于TEM GT表中的trp_id造成的。我不想在事件表中添加trp_id,而是想在上面的select查询中处理重复消除 我正在使用Oracle11g。请帮我做这个 我只是构建下面的sql。这几乎解决了我的问题。但有时它会为amount列返回不同的值。我希望est id1的事件低结果如下所示
event_low_id primary key, event_id, est_id, amount.
9991 1000 1 1.5
9992 1000 2 2.0
但有时它会回来
event_low_id primary key, event_id, est_id, amount.
9991 1000 1 1.5
9992 1000 2 1.5
或
任何帮助都可以进一步调整它以获得准确的结果。提前感谢据我所知,根据条件,您的示例查询应该只返回3行 但是,您的问题的答案可能是使用
选择distinct
。我还建议使用标准的join
语法:
select distinct event_low_id_s.nextval, e.event_id, tg.est_id, tg.amount
from TEM_GT tg join
EVENT ee
on tg.trans_id = e.trans_id
where e.flag = 'N'
您在插入时的语法不正确,这表明您编辑了查询,删除了有问题的部分。我的第一反应是使用
DISTINCT
。然后我注意到复制品有不同的数量
。
您需要决定使用哪个金额
,然后应用相应的组功能
示例(如果愿意,请替换MAX
和SUM
):
请编辑您的帖子并格式化表设计和sql示例代码。问题中的信息与您描述的行为不匹配。数据库中与SQL匹配的行比上面显示的多!您应该全面检查您的问题,因为它有几个错误:TEM_GT:est_id=2,但在EVENT_LOW中对应行的值为1。insert的语法错误,缺少表名。得到5行的原因可能是在trans_is=111.Hi Klas的事件中有2行。对你是对的。因为事件表有两行用于trans_is=111,TEM_GT表也有两行用于trans_is=111。我需要EVENT_LOW表应该有两行用于trans_is=111。就是这样。因此,在select语句的4行中,我只需要2行。insert语句无法工作。缺少一个表名。您好@Gordon linoff,我已尝试了您的查询。仍然为事件\u id 1000获取4行。但只需要两行。对我已经编辑了我的查询。您好,Gordon,您的查询出现错误
ORA-02287:此处不允许序列号
。您好,Klas,实际上,我需要处理所有金额(在本例中,对于trans_id 111,需要同时处理1.5和2.0)。上述连接不起作用。我仍然得到了事件id-1000的4行。啊,est\u id
也不同。我已经编辑了我的答案,也许这更符合你的要求?嗨,克拉斯,我需要分别处理每个est_id。因此,我的event_low表应该有两行用于est_id
1,并且金额不应该求和。应该分开处理<代码>事件低id主键、事件id、est id、金额。9991 1000 1 1.5 9992 1000 1 2.0 9993 1001 2 3.0在这种情况下,您应该检查Gordon Linoff的答案。这似乎是正确的。如果获得的行太多,那是因为数据库中与SQL匹配的行比问题中显示的多。
event_low_id primary key, event_id, est_id, amount.
9991 1000 1 1.5
9992 1000 2 1.5
event_low_id primary key, event_id, est_id, amount.
9991 1000 1 2.0
9992 1000 2 2.0
select *
from (select x.*,
row_number() over (partition by event_id order by event_id) rn
from (seelct e.event_id, tg.est_id, tg.amount
from TEM_GT tg, EVENT e
WHERE
tg.trans_id = e.trans_id
AND e.flag = 'N'
) x
)
where rn = 1
select distinct event_low_id_s.nextval, e.event_id, tg.est_id, tg.amount
from TEM_GT tg join
EVENT ee
on tg.trans_id = e.trans_id
where e.flag = 'N'
select event_low_id_s.nextval e.event_id, MAX(tg.est_id), SUM(tg.amount)
from TEM_GT tg join
EVENT ee
on tg.trans_id = e.trans_id
where e.flag = 'N'
group by e.event_id