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 的不吝赐教啊~~~
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 的不吝赐教啊~~~
相关文章推荐
- 原来还可以这么写sql语句
- 原来EXECL可以这么玩
- 原来多线程中的join()是这么回事(转)
- 第一交易所即将面世,交易所原来可以这么玩!
- JSON解析的成长史——原来还可以这么简单
- 原来跟新语句和查询语句通用的跟新可以这么写的
- 原来JS可以这么写
- PL/SQL可以连oracle,但是jdbc连不上,原来是因为url链接方式不同 格式不一样
- 深度寻路算法,原来算法可以这么简单的理解学习?!
- 原来多线程中的join()是这么回事
- 车原来可以这么开
- 原来编译原理可以这么学
- 原来gdt和gdtr可以这么得来
- 心电图测量原来可以这么简单
- 原来java的List可以这么玩
- svg拉伸,原来凹凸可以这么玩
- JavaScript 原来可以这么优雅
- sql 语句可以这么些
- java连连看源码分享(原来连连看这么简单,你也可以写)
- 原来指针可以这么来理解,妈妈再也不用担心我的编程了