打印本文 打印本文 关闭窗口 关闭窗口
结构化子查询:在mysql4.1中的应用
作者:武汉SEO闵涛  文章来源:敏韬网  点击数3251  更新时间:2009/4/22 20:49:02  文章录入:mintao  责任编辑:mintao
 

INSERT INTO firms VALUES

  (10,''''abc co'''',''''leduc''''),(30,''''ghi inc'''',''''nisku'''');

因为在这个查询中表firms有两行记录返回:

SELECT * FROM clients WHERE clno <

  (SELECT clno FROM firms);

错误原因:

"Subquery returns more than 1 row"

 

这种情况有两个解决方法。第一个是修改查询让其用any包含,使外部查询的比较任意的值 :

SELECT * FROM clients WHERE clno < ANY

  (SELECT clno FROM firms);

在这里,第一个比较是(10<10),返回为false,但是第二个比较(10<30),返回true,因此子查询返回true,使用的是 clno 10相比较的结果,使用any 的规则如下:

  • ANY返回true,如果子查询的比较操作至少有一个是是true。
  • ANY 返回 false,如果子查询返回为空行,或者比较任意一行都是false。

ANY的同义词是SOME,使用in 等同于使用 = ANY。

第二种方法是修改查询,使用all包含子查询,比较外部的查询结果使用每一个子查询的值。

SELECT * FROM clients WHERE clno < ALL

  (SELECT clno FROM firms);

在这里,第一次的比较还是返回false,而第二此返回true,最后,子查询的结果是false,所以查询返回空行。使用all的规则是:

  • 返回true,如果子查询返回空行记录,或者子查询的每一个结果比较都为true的话。
  • 返回false,如果子查询至少有一个比较结果返回false。

Does the Subquery Return at least One Row?

子查询至少要求返回一行么?

在有些时候,查询的结果是子查询是否有一个结果返回。使用[NOT] EXISTS来判断结果集是否为空。如果你的子查询至少有一行返回,使用EXISTS 返回 true;否则,返回为false。还有一种用法,NOT EXISTS,如果子查询结果集为空,它返回为true,否则的话,返回为true。一般情况下,子查询跟随在 [NOT] EXISTS后面,以select * 开头。在这里,星号(*)不是表示列出所有的列,而是表示为列出一些列。这里有一个小例子,返回所有client表的结果。

 

SELECT * FROM clients WHERE EXISTS

  (SELECT * FROM firms);

在本例当中,where子句返回true,因为表firms不为空。通常[NOT] EXISTS会使用在更加复杂的情况下面,假设你有一下数据表:

CREATE TABLE passengers (

   name VARCHAR(15),

   compartment INT);

 

INSERT INTO passengers VALUES (''''smith'''',20);

INSERT INTO passengers VALUES (''''jones'''',25);

 

CREATE TABLE cars (

上一页  [1] [2] [3] [4] [5]  下一页

打印本文 打印本文 关闭窗口 关闭窗口