我正在编写一个嵌套的 MySQL 查询,其中子查询返回多行,因此无法执行查询。
谁能建议我解决这个问题?
提前致谢。
关于返回多个值的子查询的错误告诉我您正在尝试直接值比较,如下所示:
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 指出的那样,子查询通常不会返回超过一列(尽管某些数据库支持元组匹配),在这种情况下,您需要定义派生表/内联视图并加入它。
如果能获得有关您遇到的问题的更多信息会很高兴...
尝试加入派生表而不是执行子查询;它将允许您返回多个字段:
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 ...
这听起来像是一个逻辑问题,而不是语法问题。
为什么子查询返回不止一行?
为什么你把它放在一个只需要一排的地方?
你需要重组一些东西来把这两件事结合在一起。没有任何迹象表明您的系统、您的查询或您的意图,很难进一步提供帮助。
如果数据库说您返回多行,您应该听它说什么并更改您的查询,以便它只返回一行。
这是你的逻辑问题。
更改查询,使其仅返回一行。
想想为什么查询返回多行,并确定如何让查询从该结果中只返回您需要的单行。
在子查询上使用 LIMIT 子句,因此它始终最多返回 1 行
您可以将 a 添加LIMIT 1
到子查询中,以便顶部查询仅考虑第一个结果。您还可以在执行 LIMIT 之前对子查询的结果进行排序,以返回具有最高/最低 X 的结果。但请确保这实际上是您想要发生的,因为多行子查询通常是潜在的症状问题。