先举例如下:
1.用如下的sql查询数据,有4条记录(我想要的结果)
select * from tableA
union 
select * from tableB where colId=3 or parentcolId=3
2.用如下的sql创建视图view2
select * from tableA
union 
select * from tableB执行select * from view2 where colId=3 or parentcolId=3,查询出来的记录只有2条了(不想要的结果)问题:
为什么条件直接放在sql里与在程序中传的条件查询出来的结果会不一样呢?要怎样做才能达到我想要的结果呢?
请各位前辈指教一二!在此先谢过了~

解决方案 »

  1.   

    是不是tableA中的记录都是 colId<>3 and parentcolId<>3
    第1中写法没有对tableA过滤,第2种写法反之
      

  2.   

    select * from tableA
    union all
    select * from tableB把视图改成这个试试另:你tableA和tableB的表结构是怎样的?
      

  3.   

    用Union all的时候会多出几条重复记录。
    我这里的表实际上是一个自连接的表,其中关键的是2个字段,id和parentid,想要实现的效果是传入一个parentid的值,可以把id为传入的值的数据和这个id的所有下级数据都查询出来。
    现在的结果是我用第一个查询语句直接在sql中写条件能得到理想的结果,把条件去除生成view以后传条件查询就只有本级和下级的数据,再下级的就没有了。
    想问问前辈,这里是有什么问题,该怎么解决?或者有更好的办法?
      

  4.   


    select * from tableA
    union  
    select * from tableB where colId=3 or parentcolId=3你这里的联合是把tableA的所有数据和tableB中字段colId或字段parentcolId为3的数据联合,也就是说这个条件只针对tableB的。而创建视图后,是把tableA和tableB的所有数据先联合起来,其后的查询条件就不仅仅只针对tableB了,是针对tableA和tableB联合后的所有数据,故自然会排除掉之前tableA中colId或parentcolId字段非3的数据,记录就减少了。不知你这边为何用到视图?
      

  5.   

    当然不相同啊!
    select * from tableA
    union  
    select * from tableB where colId=3 or parentcolId=3
    这里是tableA的条数+tableB 满足条件的条数select * from view2 where colId=3 or parentcolId=3这里因为建视图了!把A,B当成一个表了查出来的是A,B集合里面满足条件的!
      

  6.   

    可以通过添加一表值函数来处理:CREATE FUNCTION [dbo].[selectByTableBID] 
    (
    @colId int,
    @parentcolId int
    )   
    RETURNS TABLE   
    AS   
    RETURN(
    select * from tableA
    union
    select * from tableB where colId=@colId or parentcolId=@parentcolId
    )   
    select * FROM dbo.selectByTableBID(3,3)
    通过该语句查询即可
      

  7.   

    我感觉是那个or的问题
    sql中的或逻辑 如果Or前面为真  会直接忽略后面的语句
      

  8.   

    这种简单查询你就用sql语句吧,用视图的话无法满足你的要求,因为你的条件不是查询两个表的共同条件
      

  9.   

    这个查询可能算是简单吧,但是加到项目里面就复杂了。因为用存储过程做了分页,要传参数进存储过程,其中包括表名、字段、条件等等很多东西,我创建视图就是把它作为一个表名传到存储过程进行分页的。但是我传条件进去查询时的结果总是不理想。我举的例子也有错,只有一个表的,如tableA(id,parentid)
    其中的数据为
    1 0
    3 1
    5 3
    6 5
    7 5
    假设要查询id=5和其所有下级的数据,结果应该是
    5 3
    6 5
    7 5