【问题标题】:get the first row of a join获取连接的第一行
【发布时间】:2009-12-04 17:55:33
【问题描述】:

我有一个这样的查询:

select t1.id, t1.sample, t2.id from table t1 join table t2  
on t1.sample = t2.sample and t2.id > t1.id

我需要得到满足第二个条件的第一行。

有什么想法吗?

【问题讨论】:

  • 第一行究竟基于什么?您没有对结果集进行排序。
  • 我认为,如果您在两个表中提供示例数据以及您期望的输出示例,将会有所帮助。我没有遵循您在其他 cmets 中的意思“对于所有 id,我必须采用满足 > 条件的第一个 id”。

标签: oracle join


【解决方案1】:
SELECT t1.id, t1.sample, t2.id FROM table t1 JOIN TABLE t2
ON t1.sample = t2.sample AND t2.id > t1.id WHERE ROWNUM = 1

【讨论】:

  • 这种技术有一个陷阱。如果 SELECT 包含 ORDER BY 子句,则 WHERE ROWNUM = 1 将在 ORDER BY 之前执行。在这种情况下,将整个 SELECT(减去 WHERE ROWNUM = 1 条件)放在子查询中,然后 SELECT * FROM(您的子查询)WHERE ROWNUM = 1。是的,它很复杂,但 Oracle 有时也是如此。
  • rownum = 1 有效,但我需要提取所有 id 而不仅仅是一个。
  • 你不是说要让第一行满足你的条件吗?
【解决方案2】:

嗯。

你可以试试这个: 如果您正在使用 SQL Server, 添加前 1 个

如果您使用的是 MySQL,请添加限制 1

它只会返回第一行。

为确保,您也可以添加订单子句。

【讨论】:

    【解决方案3】:

    返回的所有行都将满足这两个条件,因此您无需执行任何特殊操作即可确保满足第二个条件。

    如果要将返回的结果大小限制为 1,请将 WHERE ROWNUM = 1 附加到要在 Oracle 上运行的查询。

    【讨论】:

    • 是的,但是对于所有 id,我必须取第一个满足 > 条件的 id,rownum = 1 只返回第一行。
    • 我不确定我是否理解问题;返回的所有 id 都将满足 > 条件。除了 t2.id > t1.id,你还在寻找最大的 t2.id 吗?
    【解决方案4】:

    Oracle 使用称为“ROWNUM”的东西。限制结果的数量在 DBMS 之间是不一致的,令人讨厌。

    SELECT t1.id, t1.sample, t2.id
    FROM table t1 join table t2  
    ON t1.sample = t2.sample and t2.id > t1.id
    WHERE ROWNUM <= 1
    

    【讨论】:

      【解决方案5】:

      如果你想要满足第二个条件的最小 t2.id 那么

      select * from (select t1.id, t1.sample, t2.id from table t1 join table t2
      on t1.sample = t2.sample and t2.id > t1.id order by t2.id ) where rownum =1

      如果你想要满足第二个条件的最大 t2.id 那么

      select * from (select t1.id, t1.sample, t2.id from table t1 join table t2
      on t1.sample = t2.sample and t2.id > t1.id order by t2.id desc) where rownum =1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-09
        • 1970-01-01
        • 2018-06-19
        • 1970-01-01
        • 1970-01-01
        • 2012-03-22
        相关资源
        最近更新 更多