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

一个棘手的外键为空的问题
有两个
工艺表,TN_PROCESS_PLANING(ID int,ID_MODIFY int),工艺id号和工艺修改人id
人员表 USERS(ID int,NAME char(20)),人员id,人员名称
当 工艺还没有人修改时,ID_MODIFY值为null

当我想查询工艺表id,以及工艺修改人的姓名时
select TN_PROCESS_PLANING.ID,USERS.NAME from TN_PROCESS_PLANING,USERS where TN_PROCESS_PLANING.ID_MODIFY = USERS.ID
如果某个工艺的修改人为空时,那么这条工艺就被过滤掉了

怎么让这个工艺还出现,而把修改人置为空值就行了

------解决方案--------------------
改用left join 可以的,1楼理解错了

------解决方案--------------------
SQL code
declare @gy table (ID   int,ID_MODIFY   int)
insert into @gy select 1,null
insert into @gy select 1,2
declare @user table(ID   int,NAME   char(20))
insert into @user select 1,'李'
insert into @user select 2,'张'

select   b.*  from   
(

select * from @gy where id_modify is not null

) a,  @user b  
where   a.ID_MODIFY   =   b.ID

------解决方案--------------------
有两个 
工艺表,TN_PROCESS_PLANING(ID int,ID_MODIFY int),工艺id号和工艺修改人id 
人员表 USERS(ID int,NAME char(20)),人员id,人员名称 
当 工艺还没有人修改时,ID_MODIFY值为null 

当我想查询工艺表id,以及工艺修改人的姓名时 
select TN_PROCESS_PLANING.ID,USERS.NAME from TN_PROCESS_PLANING,USERS where TN_PROCESS_PLANING.ID_MODIFY = USERS.ID 
如果某个工艺的修改人为空时,那么这条工艺就被过滤掉了 

怎么让这个工艺还出现,而把修改人置为空值就行了

--确实理解错了,不好意思.使用left join , isnull(col , '') col
SQL code
select TN_PROCESS_PLANING.ID,isnull(USERS.NAME,'') name from
TN_PROCESS_PLANING left join USERS   
on TN_PROCESS_PLANING.ID_MODIFY = USERS.ID

------解决方案--------------------
我想象四楼说的这样 
select TN_PROCESS_PLANING.ID,USERS.NAME from TN_PROCESS_PLANING,USERS where TN_PROCESS_PLANING.ID_MODIFY = USERS.ID or TN_PROCESS_PLANING.ID_MODIFY=null 
但不知道会不会出现笛卡尔积这种情况 
---------------------------------------------------
会出现局部的笛卡儿积现象。
也就是NULL的会和所有的记录配对。
还是用isnull() 和left join 吧。