【问题标题】:LEFT OUTER JOIN with LIMIT带 LIMIT 的 LEFT OUTER JOIN
【发布时间】:2014-03-16 22:15:38
【问题描述】:

我正在尝试从一个表中获取一定数量的记录以及来自另一个表的相关数据:

SELECT a.*, b.* FROM tblA a
   LEFT OUTER JOIN tblB b ON a.id = b.target WHERE ... ORDER BY ... LIMIT 0,40

它有效,但问题是 LIMIT 似乎限制了结果的数量,而不是我在 A 中找到的记录数量 :(

有没有办法让 LIMIT 只考虑来自 A 的记录?因为来自 A 的记录可能在 B 中有许多相关记录,我不想限制这一点

【问题讨论】:

  • 我想澄清这个声明:“a record from A may have many related records in B and I don't want to limit that”。这意味着您需要从表 A 中总共获得 40 条记录。这真的是您想要的吗,还是您希望 A 中的每个键从 B 中最多 40 条记录?
  • 是的,这就是我想要的。 B 可以有任意数量的记录链接到来自 A 的记录,或者没有。基本上 B 就像 A 的元数据。所以我想从 A 查询 40 条记录,并尽可能使用相同的查询获取元数据

标签: sql sqlite join limit


【解决方案1】:

尝试将限制放在子查询中,然后加入。

SELECT
  *
FROM
(
  SELECT * FROM tblA WHERE ... ORDER BY ... LIMIT 0,40
)
  AS a
LEFT JOIN
  tblB AS b
    ON a.id = b.target

很多RDBMS都会支持这个,我不知道SQLite。

【讨论】:

  • 不能在子查询中使用 ORDER BY,否则在正确的轨道上。
  • 所以没有办法用 ORDER 做到这一点? LEFT JOIN 怎么了?这不会忽略来自 A 且在 B 中没有关联记录的任何记录吗?
  • @JoelCoehoorn:您可以在子查询中使用order by,只要子查询具有limit(或SQL Server 中的top)。
  • @thelolcat - LEFT JOINLEFT OUTER JOIN 是同义词。我只是习惯于写较短的形式。就我的 SQLFiddle 示例而言,这似乎可以满足您的需求。
猜你喜欢
  • 2020-03-11
  • 1970-01-01
  • 2014-08-10
  • 2011-01-30
  • 2010-09-29
  • 1970-01-01
  • 2013-03-10
  • 2018-12-04
相关资源
最近更新 更多