MySQL 嵌套查询执行

Posted

技术标签:

【中文标题】MySQL 嵌套查询执行【英文标题】:MySQL nested queries execution 【发布时间】:2010-08-08 14:45:57 【问题描述】:

我正在编写一个嵌套的 mysql 查询,其中子查询返回多行,因此无法执行查询。

谁能建议我解决这个问题?

提前致谢。

【问题讨论】:

提供示例代码? 问题出在第 4 行。只需更改它即可。 【参考方案1】:

关于返回多个值的子查询的错误告诉我您正在尝试直接值比较,如下所示:

WHERE col = (SELECT col2 FROM TABLE_2)

解决方案取决于来自子查询的数据 - 您是否希望查询使用所有返回的值?如果是,则更改 IN 的等号:

WHERE col IN (SELECT col2 FROM TABLE_2)

否则,您需要更正子查询,使其只返回一个值。 MAX 或 MIN 聚合函数是可能的 - 它们将返回最高或最低值。这可能只是关联子查询的问题:

  FROM TABLE_1 t1
WHERE t1.col = (SELECT MAX(t2.col2)
                           FROM TABLE_2 t2
                         WHERE t2.fk_col = t1.id)  -- correlated example

正如 Tabhaza 所指出的,子查询通常不会返回超过一列(尽管某些数据库支持元组匹配),在这种情况下,您需要定义派生表/内联视图并加入它。

如果能获得有关您遇到的问题的更多信息会很高兴...

【讨论】:

【参考方案2】:

尝试加入派生表而不是执行子查询;它将允许您返回多个字段:

SELECT a.Field1, a.Field2, b.Field3, b.Field4
FROM table1 a INNER JOIN 
  (SELECT c.Field3, c.Field4, c.Key FROM table2 as c) as b ON a.Key = b.Key
WHERE ...

【讨论】:

【参考方案3】:

这听起来像是逻辑问题,而不是语法问题。

为什么子查询返回多行?

为什么你在一个只需要一排的地方有这个?

你需要重组一些东西来把这两个东西结合在一起。没有任何迹象表明您的系统、您的查询或您的意图,很难提供进一步的帮助。

【讨论】:

【参考方案4】:

如果数据库说您返回多行,您应该听它说什么并更改您的查询,以便它只返回一行。

这是你的逻辑问题。

更改查询,使其只返回一行。

考虑查询返回多行的原因,并确定如何让查询从该结果中仅返回您需要的单行。

【讨论】:

【参考方案5】:

在子查询上使用 LIMIT 子句,因此它总是最多返回 1 行

【讨论】:

这回避了问题——如果子查询应该返回 1 个值但返回多个值,则子查询写不正确。 LIMIT 子句修补症状,但不修补原因。 好吧,既然没有发布代码,答案是有效的,我们怎么知道他不只是在寻找子查询中的最后/最大/任何行,并且返回的第一行总是正确的一个?【参考方案6】:

您可以将LIMIT 1 添加到子查询中,以便顶部查询仅考虑第一个结果。您还可以在执行 LIMIT 之前对子查询的结果进行排序,以返回具有最高/最低 X 的结果。但请确保这实际上是您想要发生的,因为多行子查询通常是潜在的症状问题。

【讨论】:

这回避了问题——如果子查询应该返回 1 个值但返回多个值,则子查询写不正确。 LIMIT 子句修补症状,但不修补原因。 那么该怎么办@jonathan Leffler 先生,请提出您的解决方案 @Ankur:向我们展示更多信息 - 不工作的 SQL,以及足够的(大纲)表模式(包括表名!),人们有事情要做。一个模糊的问题只能得到模糊的答案——不幸的是。

以上是关于MySQL 嵌套查询执行的主要内容,如果未能解决你的问题,请参考以下文章

Mysql嵌套查询与连接查询的效率问题

sql语句中嵌套时候用in 和=有啥区别

mysql_数据查询_嵌套查询

mysql怎么在查询中嵌套子查询

MySQL嵌套查询语句

嵌套 MySQL 查询和字母数字排序