当前位置: 首页 > 面试题库 >

限制左联接

羊舌承天
2023-03-14
问题内容

我有一个表,我们称它为“ a”,它在涉及许多表的视图中用在左联接中。但是,我只想返回“ a”的行(如果它们也与另一个表“ b”联接)。所以现有的代码看起来像

SELECT ....
FROM main ...
...
LEFT JOIN a ON (main.col2 = a.col2)

但它返回的行太多,尤其是其中a在b中不匹配的行。我试过了

SELECT ...
FROM main ...
...
LEFT JOIN (
   SELECT a.col1, a.col2
   FROM a
   JOIN b ON (a.col3 = b.col3)) ON (a.col2 = main.col2)

这给了我正确的结果,但是不幸的是,“ EXPLAIN
PLAN”告诉我们,这样做会导致强制对a和b进行全表扫描,这使事情变得很慢。我的一位同事在b上建议了另一个LEFT
JOIN,但这是行不通的,因为它在出现b时给了我b行,但并没有停止从b中没有匹配项的a行返回。

有什么方法可以将main.col2条件放入子SELECT中,从而摆脱全表扫描吗?或采取其他方式来做我想做的事?


问题答案:
SELECT ...
FROM ....
LEFT JOIN ( a INNER JOIN b ON .... ) ON ....


 类似资料:
  • 我有一个表'gems'在那里存储帖子(例如blog)。对帖子的回复也存储在同一个表中,其中有一个字段存储父帖子的密钥。每个帖子都可以附上文件。 我需要得到一个与相关的回复和附加文件的帖子列表。因此“gems”有多个左联接--一个连接到它自己,一个连接到带有文件名的“gemdetail”。此查询有效: 但是,如果我每个帖子有20个回复和10个文件,那么返回的记录数是每个帖子200条。限制条款起作用,

  • 问题内容: 以两个表为例:和。 列出产品详细信息,包括名称和ID,同时列出涉及产品的交易,包括日期,产品ID,客户等。 我需要显示一个网页,其中显示10个产品,每个产品的最近5个交易。到目前为止,如果mysql允许该部分,则似乎没有任何查询有效,并且下面的子查询也可以工作( 在“ where子句”中 出现 Unknown列“ ta.product_id”的 失败 :[ERROR:1054] )。

  • 问题内容: 我有两个表:gem和gemdetail保持连接状态。我试图将LEFT JOIN限制为gems表中的10条记录。也有两个其他表联接(gemreply和用户),但它们不会导致该问题。以下内容不起作用: 这将返回的行总数限制为10,但是由于每个gem有多个明细记录,所以我剩下不到10个gem记录。我已经阅读了每个“ LIMIT”帖子,但没有发现这种情况。 更新1:好的-感谢jviladric

  • 问题内容: 使用hibernate条件时,仅更改联接类型会影响根域类的子级集合的结果。 例如,让Parent类与Child类具有一对多关系,并具有以下数据: 使用以下hibernate条件返回1父行,访问子集合结果将返回两行: 但是,当通过左连接更改上述代码时,将返回1父行,但是在访问子集合时仅返回匹配的子行。 为什么会出现这种副作用?我发现了一些关于使用或避免这种副作用的讨论,具体取决于您的预期

  • 在单个联合中可引用的最大表数为61。它也适用于在视图定义中可引用的最大表数。 这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访问dev.mysql.com。 原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。

  • 问题内容: 这个问题已经在这里有了答案 : SQL中左右联结与左右联结之间的区别[重复] (4个答案) 6年前关闭。 我看到过称为LEFT OUTER JOIN或RIGHT OUTER JOIN的联接。在某些地方,我见过LEFT JOIN或RIGHT JOIN。我对此感到困惑。 我两天前发布了一个问题,但我无法理解解决方案提供的链接。 这些连接类型是否相同,或者两者之间有区别? 问题答案: 两者之