is not null怎么不起作用啊?急啊!!!

udonome 2003-12-24 03:36:49
我有一个视图,里面用了外连接,因此有些字段的内容被设成了null,如
表A
字段a 字段b
1 a
2 b
3 c
表B
字段a 字段c
1 d
2 e
create view C as select 表A.字段a,字段b,字段c from 表A,表B where 表A.字段a*=表B.字段a
这样视图C的内容为
字段a 字段b 字段c
1 a d
2 b e
3 c null
现在我想筛选掉字段c为null的内容,用了
select * from C where 字段c is not null
可是为什么返回的结果还是有
3 c null
这条记录阿?是不是外连接不能筛选掉null?如果不行的话要怎样处理才能得到我想要的结果,望高手指教!
...全文
1323 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
udonome 2003-12-24
  • 打赏
  • 举报
回复
真的是这个问题,谢谢zjcxc(邹建)!

Rotaxe 2003-12-24
  • 打赏
  • 举报
回复
SQL Server 建议外联接采用ANSI的写法。应为以前*=的写法无法区分联接条件和查询条件。
以下来自在线帮助
查询所选的行首先通过 FROM 子句联接条件进行筛选,其次由 WHERE 子句搜索条件筛选,然后由 HAVING 子句搜索条件筛选。可以在 FROM 或 WHERE 子句中指定内联接而不影响最后结果。

然而,根据联接条件是在 FROM 子句中还是在 WHERE 子句中,外联接条件与 WHERE 搜索条件的交互可能会不同。因此,建议不要在 WHERE 子句中指定 Transact-SQL 外联接,这种方法不再写入文档并将在以后的版本中除去。

例如,下面两个查询对 SELECT 23 行指定左向外联接,用以显示书名标识号、书名以及已出售的书的数量:

-- Join in WHERE clause.
USE pubs
SELECT t.title_id, t.title, s.qty
FROM titles AS t, sales AS s
WHERE t.title_id *= s.title_id

-- Join in FROM clause.
USE pubs
SELECT t.title_id, t.title, s.qty
FROM titles AS t LEFT OUTER JOIN sales AS s
ON t.title_id = s.title_id

在下面的查询中,WHERE 子句也指定搜索条件:

-- Join and search condition in WHERE clause.
USE pubs
SELECT t.title_id, t.title, s.qty
FROM titles AS t, sales AS s
WHERE t.title_id *= s.title_id
AND s.stor_id = '7066'

stor_id = '7066' 条件在联接中取值。联接只从 sales 表中选择 stor_id 7066 的行,但由于这是外联接,因此空值在所有其它行中作为存储信息提供。此查询将返回 18 行。

可以将联接条件移动到 FROM 子句,而 stor_id 条件留在 WHERE 子句中:

USE pubs
SELECT t.title_id, t.title, s.qty
FROM titles AS t LEFT OUTER JOIN sales AS s
ON t.title_id = s.title_id
WHERE s.stor_id = '7066'

由于执行左向外联接之后应用 stor_id = '7066' 限制条件,因此此查询只返回两行。这就消除外联接中 stor_id 为 NULL 值的所有行。若要通过 FROM 子句中的联接条件返回相同的信息,请将 stor_id = '7066' 条件指定为 FROM 子句中 ON join_criteria 部分,然后删除 WHERE 子句:

USE pubs
SELECT t.title_id, t.title, s.qty
FROM titles AS t LEFT OUTER JOIN sales AS s
ON t.title_id = s.title_id
AND s.stor_id = '7066'

udonome 2003-12-24
  • 打赏
  • 举报
回复
谢谢上面的,我去试试看:)
zjcxc 元老 2003-12-24
  • 打赏
  • 举报
回复
所以,问题不是出在:
is not null上

而是在连接上.
zjcxc 元老 2003-12-24
  • 打赏
  • 举报
回复
--下面是测试,用left join就可以得到正确结果了

--创建测试数据
create table 表A(字段a int,字段b varchar(10))
insert into 表A
select 1,'a'
union all select 2,'b'
union all select 3,'c'

create table 表B(字段a int,字段c varchar(10))
insert into 表B
select 1,'d'
union all select 2,'e'
go

--创建视图
create view C
as
select a.字段a,字段b,字段c
from 表A a left join 表B b on a.字段a=b.字段a
go

--查询
select * from c where 字段c is not null
go

--删除测试环境
drop view c
drop table 表A,表B

/*--测试结果
字段a 字段b 字段c
----------- ---------- ----------
1 a d
2 b e

(所影响的行数为 2 行)

--*/
zjcxc 元老 2003-12-24
  • 打赏
  • 举报
回复
在SQL中,不要用*=,它可能会导致不正确的结果.

下面是联机帮助上的说明:

*=
Transact-SQL 联接
在早期的 Microsoft® SQL Server™ 2000 版本中,使用 *= 和 =* 在 WHERE 子句中指定左、右外部联接条件。

有时,该语法会导致有多种解释的不明确查询。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
------------------------------------------

FROM 子句中指定遵从 SQL-92 的外部联接,不会导致上述不确定性。因为 SQL-92 语法更为精确,所以,本版中未包括有关在 WHERE 子句中使用旧的 Transact-SQL 外部联接语法的详细信息。以后的 SQL Server 版本可能不再支持该语法。任何使用 Transact-SQL 外部联接的语句都应改为使用 SQL-92 语法。

SQL-92 标准支持 FROM 或 WHERE 子句中的内部联接规范。WHERE 子句中指定的内部联接不会出现与 Transact-SQL 外部联接语法相同的不确定性问题。

zjcxc 元老 2003-12-24
  • 打赏
  • 举报
回复
--你的视图那样建不好.这样处理就没问题了.

create view C
as
select a.字段a,字段b,字段c
from 表A a left join 表B b on a.字段a=b.字段a
go
gmlxf 2003-12-24
  • 打赏
  • 举报
回复
没有遇到过,怎么会有问题》?
gmlxf 2003-12-24
  • 打赏
  • 举报
回复
select * from C where 字段c not is null
----
这样不对。

应该是 is not null
sdhdy 2003-12-24
  • 打赏
  • 举报
回复
create view C as
select 表A.字段a,字段b,isnull(字段c,'') from 表A,表B where 表A.字段a*=表B.字段a

select * from C where 字段c <>''
victorycyz 2003-12-24
  • 打赏
  • 举报
回复
select * from C where 字段c not is null

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧