select 1 from 浅析
今天看到项目代码里有这条语句,不懂select 1 from XXXXXXX里的1是何意,查了一番才知道:
1、select 1 from mytable;与select anycol(目的表集合中的任意一行) from mytable;与select * from mytable 作用上来说是没有差别的,都是查看是否有记录,一般是作条件用的。select 1 from 中的1是一常量,查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。
2、查看记录条数可以用select sum(1) from mytable;等价于select sum(*) from mytable;
3、实际项目SQL:
select c_insrnc_cde, c_nme_cn
from t_prd_ins a
where a.c_prod_no = '01'
and not exists
(select 1
from (select d.c_insrnc_cde, a.c_nme_cn
from t_prd_ins a,
tb_bas_ply_policy_rdr c,
tb_bas_ply_policy_rdr_list d
where a.c_insrnc_cde = d.c_insrnc_cde
and d.c_policy_id = c.c_policy_id
and d.c_seq_no = c.c_seq_no
and a.c_kind_no = '01'
and c.c_dpt_cde = '101' ----机构树中取出机构
and c.c_prod_no = '01'
and c.t_effc_tm <= TO_DATE('2007-9-5', 'YYYY-MM-DD')
and c.t_expd_tm >= TO_DATE('2007-9-5', 'YYYY-MM-DD')
and c.c_work_mode = '00501'
and c.c_reach_area = '00701'
) t
where t.c_insrnc_cde = a.c_insrnc_cde);
二、http://blog.csdn.net/wangyihust/archive/2009/02/05/3863758.aspx
测试场景:(转自网络文献)
table表是一个数据表,假设表的行数为10行。
1:select 1 from table 增加临时列,每行的列值是写在select后的数,这条sql语句中是1
2:select count(1) from table 不管count(a)的a值如何变化,得出的值总是table表的行数
3:select sum(1) from table 计算临时列的和
在SQL SERVER中用 1 测试了一下,发现结果如下:
1:测试结果,得出一个行数和table表行数一样的临时列(暂且这么叫,我也不知道该叫什么),每行的列值是1;
2:得出一个数,该数是table表的行数;
3:得出一个数,该数是table表的行数;
然后我又用“2”测试,结果如下:
1:得出一个行数和table表行数一样的临时列,每行的列值是2;
2:得出一个数,该数是table表的行数;
3:得出一个数,该数是table表的行数×2的数
然后我又用更大的数测试:
1:得出一个行数和table表行数一样的临时列,每行的列值是我写在select后的数;
2:还是得出一个数,该数是table表的行数;
3:得出一个数,该数是table表的行数×写在select后的数
综上所述:第一种的写法是增加临时列,每行的列值是写在select后的数;第二种是不管count(a)的a值如何变化,得出的值总是table表的行数;第三种是计算临时列的和。
三、SQL%NOTFOUND 是一个布尔值。与最近的sql语句(update,insert,delete,select)发生交互,当最近的一条sql语句没有涉及任何行的时候,则返回true。否则返回false。这样的语句在实际应用中,是非常有用的。例如要update一行数据时,如果没有找到,就可以作相应操作。如:
begin
update salary set bonus = 1000 where emp_id = 10;
if sql%notfound then
raise e_noteffact;
end if;
.................
当update emp_id为10的这行记录,而这行记录不存在,则作了相应的异常抛出。
四、语句if not exists(select 1 from deleted d join inserted i on d.ID=i.ID
and d.col1=1 and i.col1=2)
if not exists 如果不存在
(..)这里该是验证更新,更新前的id等于更新后的id,并且更新前col的值是1,更新后的值是2
五、如果你想删除或者更新被Select For Update引用的记录,你可以使用Where Current Of语句。 UPDATE table_name SET set_clause WHERE CURRENT OF cursor_name; OR DELETE FROM table_name WHERE CURRENT OF cursor_name; Where Current Of语句允许你更新或者是删除最后由cursor取的记录。 下面一个使用Where Current Of更新记录的例子: CREATE OR REPLACE Function FindCourse ( name_in IN varchar2 ) RETURN number IS cnumber number; CURSOR c1 IS SELECT course_number, instructor from courses_tbl where course_name = name_in FOR UPDATE of instructor; BEGIN open c1; fetch c1 into cnumber; if c1%notfound then cnumber := 9999; else UPDATE courses_tbl SET instructor = 'SMITH' WHERE CURRENT OF c1; COMMIT; end if; close c1; RETURN cnumber; END; Deleting using the WHERE CURRENT OF Statement Here is an example where we are deleting records using the Where Current Of Statement: 译:下面一个使用Where Current Of删除记录的例子: CREATE OR REPLACE Function FindCourse ( name_in IN varchar2 ) RETURN number IS cnumber number; CURSOR c1 IS SELECT course_number, instructor from courses_tbl where course_name = name_in FOR UPDATE of instructor; BEGIN open c1; fetch c1 into cnumber; if c1%notfound then cnumber := 9999; else DELETE FROM courses_tbl WHERE CURRENT OF c1; COMMIT; end if; close c1; RETURN cnumber; END;