您的位置:首页 > 数据库

SQL:Join 原来还可以这么用

2008-12-16 16:56 363 查看
用例子说话

declare @t table(id int,IPS varchar(20),IPE varchar(20),UCountry varchar(20),UAdd varchar(20))
insert into @t values(1,'0.0.0.0 ','0.255.255.255','IANA','CZ88.NET' )
insert into @t values(2,'1.0.0.0 ','1.255.255.255','IANA','CZ88.NET' )
insert into @t values(3,'2.0.0.0 ','2.255.255.255','IANA','CZ88.NET' )
insert into @t values(4,'3.0.0.0 ','3.255.255.255','美国','新泽西通用电气公司')
insert into @t values(5,'4.0.0.0 ','4.10.255.255 ','美国','CZ88.NET' )
insert into @t values(6,'4.11.0.0','4.11.255.255 ','美国','夏威夷' )
insert into @t values(7,'4.12.0.0','4.19.77.255 ','美国','CZ88.NET' )

declare @u table(IP varchar(20))
insert into @u
select '4.12.0.5'
union all select '3.48.5.5'
union all select '2.11.2.5'
union all select '6.11.2.5'



select
*
from
@u b, @t a
where

right('00'+ParseName(b.IP,4),3)+right('00'+ParseName(b.IP,3),3)+right('00'+ParseName(b.IP,2),3)+right('00'+ParseName(b.IP,1),3)
between
right('00'+ParseName(a.IPS,4),3)+right('00'+ParseName(a.IPS,3),3)+right('00'+ParseName(a.IPS,2),3)+right('00'+ParseName(a.IPS,1),3)
and
right('00'+ParseName(a.IPE,4),3)+right('00'+ParseName(a.IPE,3),3)+right('00'+ParseName(a.IPE,2),3)+right('00'+ParseName(a.IPE,1),3)



/*
IP id IPS IPE UCountry UAdd
-------------------- ----------- -------------------- -------------------- -------------------- --------------------
4.12.0.5 7 4.12.0.0 4.19.77.255 美国 CZ88.NET
3.48.5.5 4 3.0.0.0 3.255.255.255 美国 新泽西通用电气公司
2.11.2.5 3 2.0.0.0 2.255.255.255 IANA CZ88.NET
*/

这种情况使用是:inner join 内联接,内联接也是效率最高的一种联接;

但是当如果需要显示a表没有对应信息b表的所有数据的话,这样的联接就不可以了;

select
*
from
@u b
left join
@t a
on
right('00'+ParseName(b.IP,4),3)+right('00'+ParseName(b.IP,3),3)+right('00'+ParseName(b.IP,2),3)+right('00'+ParseName(b.IP,1),3)
between
right('00'+ParseName(a.IPS,4),3)+right('00'+ParseName(a.IPS,3),3)+right('00'+ParseName(a.IPS,2),3)+right('00'+ParseName(a.IPS,1),3)
and
right('00'+ParseName(a.IPE,4),3)+right('00'+ParseName(a.IPE,3),3)+right('00'+ParseName(a.IPE,2),3)+right('00'+ParseName(a.IPE,1),3)



/*
IP id IPS IPE UCountry UAdd
-------------------- ----------- -------------------- -------------------- -------------------- --------------------
4.12.0.5 7 4.12.0.0 4.19.77.255 美国 CZ88.NET
3.48.5.5 4 3.0.0.0 3.255.255.255 美国 新泽西通用电气公司
2.11.2.5 3 2.0.0.0 2.255.255.255 IANA CZ88.NET
6.11.2.5 NULL NULL NULL NULL NULL
*/

只能使用外联接,使用了外联接并牺牲了效率。



在此要多谢libin_ftsafe 的不吝赐教啊~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: