当前位置: 代码迷 >> Sql Server >> 一个棘手的外键为空的有关问题
  详细解决方案

一个棘手的外键为空的有关问题

热度:87   发布时间:2016-04-27 18:46:13.0
一个棘手的外键为空的问题
有两个
工艺表,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,nullinsert into @gy select 1,2declare @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 fromTN_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 吧。
  相关解决方案