SQL Server 中 FULL join 在Access中不支持,参考解决方案:
今天做了个视图,JOIN了两张表,要求除了INNER JOIN的记录,还要两张表的其他未选取的记录,所以偶就想到了FULL JION。试了一下ACCESS居然不支持,狂郁闷啊!!
到网上差了一下有哥们说先LEFT JOIN,再RIGHT JOIN最后再UNION ALL一下(两个表结构要相同)。思路是对的,不过他的两张表都是SELECT *的,所以是可以的,可是我两张表都要选取部分字段的,结果出现了INNER JOIN外的记录有部分没有取到值。不知道这样描述各位是否能看懂,举个例子吧:
(SELECT T1.A,TI.B FROM TI LEFT JOIN T2 ON (TI.C=T2.C))
UNION ALL
(SELECT T1.A,TI.B FROM TI RIGHT JOIN T2 ON (TI.C=T2.C))
这样去除的记录有部分A和B字段是没有值的,为什么呢?
LEFTJOIN 和 RIGHT JOIN 的时候一定要注意表和字段的对应,一般来说LEFTJOIN的值取自前一个表(T1),RIGHT JOIN 的值取自后一个表(T2)。所以语句要改成这样:
(SELECT T1.A,TI.B FROM TI LEFT JOIN T2 ON (TI.C=T2.C))
UNION ALL
(SELECT T2.A,T2.B FROM TI RIGHT JOIN T2 ON (TI.C=T2.C))
这样的查询还是有问题的,当存在INNER JOIN时,因为是UNION ALL的所以会有重复记录的
最彻底的解决是把上述语句保存成视图(VIEW),调用时DISTINCT一下,就可以了
补充:如果想直接剔除重复记录的话,可以把UNION ALL 换成UNION,这样做UNION的效率没有UNION ALL高(因为UNION操作后,要删除重复记录、排序等操作),就不用再DISTINCT了,呵呵!!
IsNUll 的用法:
Access也有IsNull函数,但意义和参数却和T-SQL中的不同。
在T-SQL(也就是SQL Server所支持的SQL语言)中,IsNull的作用是把空值替代成指定的值。然而在Access中,IsNull的作用仅仅是判断是否为空值,而且参数的个数也和T-SQL中的不一样,只有一个输入参数。
庆幸的是Access支持iif,所以可以这样去替代:
Select iif(IsNull( express ), value1, value2 ) From TableName
iif(IsNull( express ), value1, value2 )
相当于:
If express Is Null Then
Return value1
Else
Return value2
End if
举个例子,在SQL Server中:
select IsNull(int_Filed1, 0) from Table1
换作Access,则应该被改写为:
select iif( IsNull(int_Filed1), 0, int_Filed1 ) from Table1