【问题标题】:Joining table with its own and select a row in Sql加入自己的表并在Sql中选择一行
【发布时间】:2014-03-06 00:29:02
【问题描述】:

我有一张叫做“通话”的桌子, 列是:

a_imei_number (imei of caller)
b_imei_number (imei of number which is called)
a_phone_number (number of caller)
b_phone_number (number of number which is called)
call_start_time (as hour)
call_end_time (as hour)
call_day (as day)

我正在尝试查找克隆 Imei 号码的电话,因此在相交时间必须至少有 2 行,因此 phone_numbers 必须不同,imei_numbers 相同。喜欢

id   a_imei  b_imei  a_phone   b_phone   call_start_time  call_end_time  call_day 
1    A       b       123       321        13:30            13:50          01.02.2014
2    A       c       999       888        13:41            13:55          01.02.2014

我怎样才能单独加入该表?

注意:一行的 a_imei 可能与另一行的 b_imei 相同,因为可能一个克隆电话正在呼叫,而该电话的克隆被某人呼叫。

【问题讨论】:

  • 加入你就不能像... FROM calls a, calls b WHERE a.column=b.column?
  • 不,我不能这就是我问这个问题的原因
  • 您能否向我们展示一些表格中的示例数据,以及您希望选择从您的示例数据中选择什么以及不选择什么?乍一看,我不知道你为什么不能按照我上面的建议去做。
  • 表格中的数据就像问题中一样。但我不能写选择来查找时间相交的行。其中一个的 call_start_time 将在另一个的开始和结束时间之间,而 imei 数字相同但行不同
  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?

标签: sql select join row


【解决方案1】:

以下是获取所有 a_imei 克隆的方法:

SELECT  c1.*
FROM    calls As c1
JOIN    calls As c2
    ON  c1.a_imei           =   c2.a_imei
    AND c1.a_phone          !=  c2.a_phone
    AND c1.call_start_time  <   c2.call_end_time
    AND c1.call_end_time    >   c2.call_start_time
ORDER BY c1.a_imei, c1.call_start_time, c1.call_end_time

以下是比较“a”和“b”的方法:

SELECT  c1.*, c2.*
FROM    calls As c1
JOIN    calls As c2
    ON  c1.call_start_time < c2.call_end_time
    AND c1.call_end_time   > c2.call_start_time
    AND (   (c1.a_imei     = c2.a_imei AND c1.a_phone != c2.a_phone)
        OR  (c1.a_imei     = c2.b_imei AND c1.a_phone != c2.b_phone)
        OR  (c1.b_imei     = c2.a_imei AND c1.b_phone != c2.a_phone)
        OR  (c1.b_imei     = c2.b_imei AND c1.b_phone != c2.b_phone)
        )
ORDER BY c1.a_imei, c1.call_start_time, c1.call_end_time, c1.b_imei

【讨论】:

  • a 和 b 必须在同一个查询中,因为 a_imei 和 b_imei 也可以相交,例如你和我使用相同的 imei(克隆非法)你打电话给某人所以你的 imei 在 a_imei 和同时有人在 b_imei 列中给我和我的 imei 打电话——我们会使用 imei 相同但同时具有不同电话号码的手机。
  • 我会提出一个小建议,即第一个电话小于第二个,因此它不会执行相反的操作并为 phoneA + phoneB 对和 phoneB + phoneA 返回相同的行集对...
猜你喜欢
  • 2020-01-10
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多