在 oracle sql 中配对记录

Posted

技术标签:

【中文标题】在 oracle sql 中配对记录【英文标题】:To pair up records in oracle sql 【发布时间】:2016-10-27 16:08:17 【问题描述】:

这是我的 sql: 执行时,它说

    00000 - “CROSS APPLY”位置上的“缺少关键字”。

我只是想将一些记录(在一天内 =20160720)与表中的相同 TICKET_ID 配对并返回它们的 T_TIME 和 T_LOCATION。

select a.T_TIME, b.T_TIME, a.T_LOCATION, b.T_LOCATION 
FROM TABLE a 
CROSS APPLY 
(select * from TABLE b where a.TICKET_ID = b.TICKET_ID having count(TICKET_ID) > 1) b
where (a.T_DATE=20160720);

问题是使用CROSS APPLY引起的吗?

好了,我本来想解决的问题就到这里了:)

表格如下所示:

T_TIME        |T_LOCATION   |    TICKET_ID|T_DATE
20160720091032|      ---0103|       1A268F|20160720
20160720095842|      ---0115|       63T37H|20160720
20160720133408|      ---0124|       1A268F|20160720
20160721152400|      ---0116|       598I3R|20160721
20160720125844|      ---0147|       63T37H|20160720

我想将具有相同 TICKET_ID 的记录配对。 2 条记录共享一个相同的 TICKET_ID。我想要这样的输出:

20160720091032|20160720133408|0103|0124|
20160720095842|20160720125844|0115|0147|

该表非常大,例如 T_DATE=20160720,总共将有 200000 条记录。

【问题讨论】:

为什么是from TABLE... 而不是from afrom b?你有一个叫TABLE 的表吗? 您使用的是哪个 Oracle 版本?而且我也看不出横向连接的原因。为什么不使用常规的 JOIN? @a_horse_with_no_name - 因为没有什么比 CROSS APPLY 更能说明“我有 12c 而你没有”? @Aleksej TABLE 用于我的表的名称..它很长所以我跳过它〜像这样:select a.T_TIME, b.T_TIME, a.T_LOCATION, b.T_LOCATION FROM my_table_name a @a_horse_with_no_name 版本是 11g。我看到一些网页说交叉应用表现非常好......我不太确定这是否在我的情况下正确使用......但是“两个选择”来自一个表,所以我不能使用内连接,对吗? 【参考方案1】:

一种方法是:

select a.ticket_id, a.t_time, b.t_time, a.t_location, b.t_location
from the_table a
  join the_table b on a.ticket_id = b.ticket_id and a.t_time < b.t_time
where a.t_date = 20160720;

连接条件and a.t_time &lt; b.t_time 确保结果对的“其他”版本不在结果中,例如你只会得到 (0103, 0124) 而不是 (0124, 0103)。

【讨论】:

以上是关于在 oracle sql 中配对记录的主要内容,如果未能解决你的问题,请参考以下文章

传统蓝牙学习记录:蓝牙的配对连接以及信息传输

传统蓝牙学习记录:蓝牙的配对连接以及信息传输

Oracle SELECT 查询:配对日期时折叠空值

在 SQL 中使行条目水平配对

Oracle SELECT 查询:在为不同字段配对日期时折叠 NULL 值

配对数据集中数据字段的 Pig 方法