【问题标题】:Join table condition for between 2 rows2行之间的连接表条件
【发布时间】:2014-01-30 08:54:42
【问题描述】:

是否可以加入这些表:

日志表:

+--------+---------------+------------+
| name   | ip            | created    |
+--------+---------------+------------+
| 408901 | 178.22.51.168 | 1390887682 |
| 408901 | 178.22.51.168 | 1390927059 |
| 408901 | 178.22.51.168 | 1390957854 |
+--------+---------------+------------+

订单表:

+---------+------------+
| id      | created    |
+---------+------------+
| 8563863 | 1390887692 |
| 8563865 | 1390897682 |
| 8563859 | 1390917059 |
| 8563860 | 1390937059 |
| 8563879 | 1390947854 |
+---------+------------+

结果表为:

+---------+--------------+---------+---------------+------------+
|orders.id|orders.created|logs.name| logs.ip       |logs.created|
+---------+--------------+---------+---------------+------------+
| 8563863 | 1390887692   | 408901  | 178.22.51.168 | 1390887682 |
| 8563865 | 1390897682   | 408901  | 178.22.51.168 | 1390887682 |
| 8563859 | 1390917059   | 408901  | 178.22.51.168 | 1390887682 |
| 8563860 | 1390937059   | 408901  | 178.22.51.168 | 1390927059 |
| 8563879 | 1390947854   | 408901  | 178.22.51.168 | 1390927059 |
+---------+--------------+---------+---------------+------------+

有可能吗? 特别是,如果第一个表是某个查询的结果。


更新

抱歉这个错误。我想在日志中找到下订单的人。所以订单表通过创建字段与日志表相关,即

有条件的第一行(orders.created >= log.created)

【问题讨论】:

  • 这两组数据应该如何相互关联?你用什么逻辑得到结果?
  • 我更新了我的问题。对不起这个错误

标签: sql postgresql postgresql-9.1


【解决方案1】:

这将导致非 equi 连接,性能很差:

SELECT *
FROM t2 JOIN t1
ON t1.created = 
 (
   SELECT MAX(t1.created) 
   FROM t1 WHERE t1.created <= t2.created
 ) 

您最好使用这样的基于 UNION 的游标(您可能需要添加一些类型转换才能获得有效的 UNION):

SELECT *
FROM
 (
   SELECT NULL AS name, NULL AS ip, NULL AS created2, t2.*
   FROM t2
   UNION ALL
   SELECT t1.*, NULL AS id, NULL AS created
   FROM t1
 ) AS dt
ORDER BY COALESCE(created, created2)

现在您可以按正确的顺序处理行并记住最后 t1 行中的行。

【讨论】:

    【解决方案2】:

    没有什么可以将这两个绑定在一起。 两个表中都不存在 ID 或其他列。

    如果是这种情况,您可以将这两个表连接到一个存储过程中。 在您提出第一个查询时,将数据存储在新创建的表中,在连接中使用它来获取结果并在之后将其删除。

    亲切的问候

    【讨论】:

      【解决方案3】:

      你可以使用 union

      select id, created from table_2
      union all
      select name, ip, created from table_1
      

      【讨论】:

      • 你期待什么?答案甚至没有错。您可以自己尝试查询,看看会发生什么。
      • 语句不起作用(联合的第一部分有两列,第二部分有三列)
      • 不,union all 还要求两个 select 语句具有相同的列数。此外:即使这样有效,它也不是 OP 想要的。
      猜你喜欢
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 2017-12-15
      相关资源
      最近更新 更多