/*以下错误只适用于子查询。本节把这些错误归在一起*/
/*
1.查询时,操作数多于一个,原因:用于查询的字段是一个子查询,并且结果集中包含多个字段,解决方法是用行子查询
2.查询时,返回结果多于一行,原因:where后边的子查询返回的结果集多于一行,解决方法:把where后边的=改成in 或在=后边加上any
3.更新时,子查询的数据表和外部的数据表是同一张表
*/
/*1.来自子查询的列的数目不正确:
· ERROR 1241 (ER_OPERAND_COL)
· SQLSTATE = 21000
· Message = Operand should contain 1 column(s)
在出现以下情况时,发生此错误:
SELECT (SELECT column1, column2 FROM t2) FROM t1;
如果您的目的是进行比较,您可以使用能返回多个列的子查询.不过,在其它的语境下,子查询必须为标量操作数。*/
/*下面这个sql语句就是进行两张表的对比的:查询出两张表中记录完全相同的记录*/
SELECT s1,s2
FROM t1
WHERE (s1,s2) IN (
SELECT s1,s2
FROM t2
);
/*2.来自子查询的行的数目不正确:
· ERROR 1242 (ER_SUBSELECT_NO_1_ROW)
· SQLSTATE = 21000
· Message = Subquery returns more than 1 row
如果在语句中,子查询返回的行多于一个,则发生此错误。请考虑以下例子:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
如果SELECT column1 FROM t2只返回一行,则将执行以前的查询。如果子查询返回的行多于一个,则将出现错误1242。在这种情况下,该查询将被改写为:
SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2);
*/
SELECT s1,s2
FROM t1
WHERE s2 IN (
SELECT s2 FROM t2
);
SELECT s1,s2
FROM t1
WHERE s2 = ANY(
SELECT s2 FROM t2
);
/*3.在子查询中表格使用不正确:
· Error 1093 (ER_UPDATE_TABLE_USED)
· SQLSTATE = HY000
· Message = You cant specify target table x
· for update in FROM clause
在如下情况下,发生该错误:
UPDATE t1 SET column2 = (SELECT MAX(column1) FROM t1);
和SELECT语句一样,在UPDATE和DELETE语句中,子查询是合法的。所以您可以在UPDATE语句中使用子查询进行赋值。不过,您不能把同一个表(在本例中为表t1)
既用于子查询的FROM子句,又用于更新目标*/
UPDATE t1 SET s2 = (SELECT MAX(s2) FROM t1);
/*对于事务存储引擎,子查询的错误会导致整个语句失效。对于非事务存储引擎,在遇到错误之前进行的数据修订会被保留*/
该贴由koei转至本版2014-5-2 16:21:48