日期:2014-05-18  浏览次数:20398 次

视图的查询条件问题
先举例如下:
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里与在程序中传的条件查询出来的结果会不一样呢?要怎样做才能达到我想要的结果呢?
请各位前辈指教一二!在此先谢过了~

------解决方案--------------------
是不是tableA中的记录都是 colId<>3 and parentcolId<>3
第1中写法没有对tableA过滤,第2种写法反之
------解决方案--------------------
select * from tableA
union all
select * from tableB

把视图改成这个试试

另:你tableA和tableB的表结构是怎样的?
------解决方案--------------------
SQL code

select * from tableA
union  
select * from tableB where colId=3 or parentcolId=3

------解决方案--------------------
当然不相同啊!
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集合里面满足条件的!
------解决方案--------------------
可以通过添加一表值函数来处理:
SQL code

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
)

------解决方案--------------------
我感觉是那个or的问题
sql中的或逻辑 如果Or前面为真 会直接忽略后面的语句
------解决方案--------------------
这种简单查询你就用sql语句吧,用视图的话无法满足你的要求,因为你的条件不是查询两个表的共同条件