SQL:Join 原来还可以这么用

来源:互联网 发布:nginx怎么配置ssl 编辑:程序博客网 时间:2024/06/11 18:33

用例子说话

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 的不吝赐教啊~~~

 

原创粉丝点击