测试结果:ID NAME DEPTNAME CNT ----------- -------------------------------------------------- -------------------------------------------------- ----------- 1 ma management 100 2 hong art 100 3 wei NULL NULL 4 sql NULL NULL(所影响的行数为 4 行)
create table student( id int primary key, name varchar(50), deptid int ) create table dept( deptid int primary key, deptname varchar(50), cnt int ) insert into student values(1,'ma',1) insert into student values(2,'hong',2) insert into student values(3,'wei',3) insert into student values(4,'sql',4) insert into dept values(1,'management',100) insert into dept values(2,'art',100) insert into dept values(3,'electronic',50) go--SQL2000中可以用自定义函数 create function STUDENT_DEPT_fuction( @cnt int )returns table as return( SELECT S.ID,S.NAME,D.DEPTNAME,D.CNT FROM STUDENT S LEFT OUTER JOIN DEPT D ON S.DEPTID=D.DEPTID and D.cnt=@cnt ) go--使用函数实现查询 select * from STUDENT_DEPT_fuction(100) go--删除测试 drop table student,dept drop function STUDENT_DEPT_fuction /*--测试结果ID NAME DEPTNAME CNT ----------- ------------- ------------- ------- 1 ma management 100 2 hong art 100 3 wei NULL NULL 4 sql NULL NULL(所影响的行数为 4 行) --*/
--不过这个问题有点奇怪,既然可以用: SELECT * FROM STUDENT_DEPT_VIEW WHERE CNT(+)=100来查询 --为什么不可以用关联条件查询: SELECT S.ID,S.NAME,D.DEPTNAME,D.CNT FROM STUDENT S LEFT JOIN DEPT D ON S.DEPTID=D.DEPTID and D.CNT=100 --如果是为了oracle中的那种参数查询效果,那就用我的函数方法.
SELECT * FROM STUDENT_DEPT_VIEW WHERE CNT=100 or cnt is null?? java中不可以吗?
to pengda1i(冒牌大力 V0.2): SELECT S.ID,S.NAME,D.DEPTNAME,D.CNT FROM STUDENT S LEFT OUTER JOIN DEPT D ON S.DEPTID=D.DEPTID and d.cnt=100 --加这里 你的这个“100”已经写死道程序里了,这不行。to zjcxc(邹建): 你的这个函数正是我的意思,但是如果不用函数怎么办?(别扔鸡蛋砸我哦)to pengdali(大力 V3.0): java中用preparedstatement或存储过程都可以,但是如果一个项目是在维护以前别人的代码,而以前的代码已经把数据操作的类封装好了,不支持这两者,整个程序的风格就是建view,然后去查询,该如何呢?各位,其实我抛出这个问题,主要是想知道sql server对“值”德外联接该如何处理?请大家帮忙!
kao,写个简单的存储过程给你,常量换成变量会吧?create proc pr_test @num int as set nocount on SELECT S.ID,S.NAME,D.DEPTNAME,D.CNT FROM STUDENT S LEFT OUTER JOIN DEPT D ON S.DEPTID=D.DEPTID and d.cnt=@numgo--楼主你太懒了
原来存储过程也不行!! 一定是view?那大力的不符合要求????100也写死了?
最后发现是无理取闹SELECT * FROM STUDENT_DEPT_VIEW WHERE CNT(+)=100 --这个100也写死了不再回答楼主的问题
TO pengda1i(冒牌大力 V0.2): 原来存储过程也不行!! 一定是view?那大力的不符合要求????100也写死了? ------------------------------------------- 对呀,100就是不能出现在VIEW里面,还请多多帮忙,谢谢。 对亚
SQL没有带参数的视图,所以你别想
TO zjcxc(邹建): 想了想,其实你的这个函数的方法也不行啊,这和存储过程是一个道理的呀。这和我想探讨“值”外联接没有关系。谢谢帮忙!!
TO zjcxc(邹建) : SQL没有带参数的视图,所以你别想 ------------------------------------ 这个我知道,那个Oracle写的view也不带参数啊。 那您的意思是说,这个“值”外联接是不可能实现的啰??
----------- -------------------------------------------------- -------------------------------------------------- -----------
1 ma management 100
2 hong art 100
3 wei NULL NULL
4 sql NULL NULL(所影响的行数为 4 行)
id int primary key,
name varchar(50),
deptid int
)
create table dept(
deptid int primary key,
deptname varchar(50),
cnt int
)
insert into student values(1,'ma',1)
insert into student values(2,'hong',2)
insert into student values(3,'wei',3)
insert into student values(4,'sql',4)
insert into dept values(1,'management',100)
insert into dept values(2,'art',100)
insert into dept values(3,'electronic',50)
go--SQL2000中可以用自定义函数
create function STUDENT_DEPT_fuction(
@cnt int
)returns table
as
return(
SELECT S.ID,S.NAME,D.DEPTNAME,D.CNT
FROM STUDENT S LEFT OUTER JOIN DEPT D ON S.DEPTID=D.DEPTID and D.cnt=@cnt
)
go--使用函数实现查询
select * from STUDENT_DEPT_fuction(100)
go--删除测试
drop table student,dept
drop function STUDENT_DEPT_fuction
/*--测试结果ID NAME DEPTNAME CNT
----------- ------------- ------------- -------
1 ma management 100
2 hong art 100
3 wei NULL NULL
4 sql NULL NULL(所影响的行数为 4 行)
--*/
SELECT * FROM STUDENT_DEPT_VIEW WHERE CNT(+)=100来查询
--为什么不可以用关联条件查询:
SELECT S.ID,S.NAME,D.DEPTNAME,D.CNT
FROM STUDENT S
LEFT JOIN DEPT D ON S.DEPTID=D.DEPTID and D.CNT=100
--如果是为了oracle中的那种参数查询效果,那就用我的函数方法.
java中不可以吗?
SELECT S.ID,S.NAME,D.DEPTNAME,D.CNT FROM STUDENT S LEFT OUTER JOIN DEPT D ON S.DEPTID=D.DEPTID
and d.cnt=100 --加这里
你的这个“100”已经写死道程序里了,这不行。to zjcxc(邹建):
你的这个函数正是我的意思,但是如果不用函数怎么办?(别扔鸡蛋砸我哦)to pengdali(大力 V3.0):
java中用preparedstatement或存储过程都可以,但是如果一个项目是在维护以前别人的代码,而以前的代码已经把数据操作的类封装好了,不支持这两者,整个程序的风格就是建view,然后去查询,该如何呢?各位,其实我抛出这个问题,主要是想知道sql server对“值”德外联接该如何处理?请大家帮忙!
@num int
as
set nocount on SELECT S.ID,S.NAME,D.DEPTNAME,D.CNT FROM STUDENT S LEFT OUTER JOIN DEPT D ON S.DEPTID=D.DEPTID
and d.cnt=@numgo--楼主你太懒了
一定是view?那大力的不符合要求????100也写死了?
原来存储过程也不行!!
一定是view?那大力的不符合要求????100也写死了?
-------------------------------------------
对呀,100就是不能出现在VIEW里面,还请多多帮忙,谢谢。
对亚
想了想,其实你的这个函数的方法也不行啊,这和存储过程是一个道理的呀。这和我想探讨“值”外联接没有关系。谢谢帮忙!!
SQL没有带参数的视图,所以你别想
------------------------------------
这个我知道,那个Oracle写的view也不带参数啊。
那您的意思是说,这个“值”外联接是不可能实现的啰??
谢谢大家的积极帮助,我的结论如下。sql server不支持“值”的外联接(即使是*=,两边也必须都为字段,不能为值)。^_^幸好程序用的是oracle,支持这个功能。
其实建view,我感觉就像小学时没学方程的时候解应用题,难度稍微大一些,思想也与写存储过程、函数方便不一样。to pengda1i(冒牌大力 V0.2) :
最后发现是无理取闹
SELECT * FROM STUDENT_DEPT_VIEW WHERE CNT(+)=100 --这个100也写死了
不再回答楼主的问题
--------------------------------------------------------------------
并非是无理取闹,
这个where条件是写在view的外面的,当然可以变了,比如:这次是100,下次是200,view根本不用改变,而以上大家所提供的办法(存储过程和函数例外),都需要把值写进view中。
^_^这个问题就到这里。