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                --加这里不用视图,简单吧?

解决方案 »

  1.   

    测试结果:ID          NAME                                               DEPTNAME                                           CNT         
    ----------- -------------------------------------------------- -------------------------------------------------- ----------- 
    1           ma                                                 management                                         100
    2           hong                                               art                                                100
    3           wei                                                NULL                                               NULL
    4           sql                                                NULL                                               NULL(所影响的行数为 4 行)
      

  2.   

    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 行)
    --*/
      

  3.   

    --不过这个问题有点奇怪,既然可以用:
    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中的那种参数查询效果,那就用我的函数方法.
      

  4.   

    SELECT * FROM STUDENT_DEPT_VIEW WHERE CNT=100 or cnt is null??
    java中不可以吗?
      

  5.   

    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对“值”德外联接该如何处理?请大家帮忙!
      

  6.   

    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--楼主你太懒了
      

  7.   

    原来存储过程也不行!!
    一定是view?那大力的不符合要求????100也写死了?
      

  8.   

    最后发现是无理取闹SELECT * FROM STUDENT_DEPT_VIEW WHERE CNT(+)=100   --这个100也写死了不再回答楼主的问题
      

  9.   

    TO pengda1i(冒牌大力 V0.2): 
        原来存储过程也不行!!
    一定是view?那大力的不符合要求????100也写死了?
    -------------------------------------------
    对呀,100就是不能出现在VIEW里面,还请多多帮忙,谢谢。  
     对亚
      

  10.   

    SQL没有带参数的视图,所以你别想
      

  11.   

    TO zjcxc(邹建):
    想了想,其实你的这个函数的方法也不行啊,这和存储过程是一个道理的呀。这和我想探讨“值”外联接没有关系。谢谢帮忙!!
      

  12.   

    TO zjcxc(邹建) :
    SQL没有带参数的视图,所以你别想
    ------------------------------------
    这个我知道,那个Oracle写的view也不带参数啊。
    那您的意思是说,这个“值”外联接是不可能实现的啰??
      

  13.   

    SQL中应该是不可能的oracel的那种视图,其实就是参数视图(至少我是这样理解的)ACCESS中的视图也可以. SQL中取消了这种功能,用存储过程/自定义来代替了
      

  14.   

    "但是如果一个项目是在维护以前别人的代码,而以前的代码已经把数据操作的类封装好了,不支持这两者,整个程序的风格就是建view,然后去查询,该如何呢?"那就改源代码了
      

  15.   

    结贴!!!
    谢谢大家的积极帮助,我的结论如下。sql server不支持“值”的外联接(即使是*=,两边也必须都为字段,不能为值)。^_^幸好程序用的是oracle,支持这个功能。
    其实建view,我感觉就像小学时没学方程的时候解应用题,难度稍微大一些,思想也与写存储过程、函数方便不一样。to  pengda1i(冒牌大力 V0.2) :
    最后发现是无理取闹
    SELECT * FROM STUDENT_DEPT_VIEW WHERE CNT(+)=100   --这个100也写死了
    不再回答楼主的问题
    --------------------------------------------------------------------
    并非是无理取闹,
    这个where条件是写在view的外面的,当然可以变了,比如:这次是100,下次是200,view根本不用改变,而以上大家所提供的办法(存储过程和函数例外),都需要把值写进view中。
    ^_^这个问题就到这里。