联接查询时where和on条件的区别一例

在关系型数据库中,关联查询中Where条件和On条件是有区别的,其中外关联查询得出的结果有可能会不一样。下边介绍示例:

现有TATB两个表,生成结构和数据的SQL如下:

TA表:

CREATE TABLE [dbo].[TA](

       [ID] [varchar](50) NOT NULL,

       [name] [varchar](50) NULL,

 CONSTRAINT [PK_TA] PRIMARY KEY CLUSTERED

(

       [ID] ASC

) ON [PRIMARY]

) ON [PRIMARY]

GO

 

TB表:

CREATE TABLE [dbo].[TB](

       [ID] [varchar](50) NOT NULL,

       [AID] [varchar](50) NOT NULL,

       [name] [varchar](50) NULL,

 CONSTRAINT [PK_TB] PRIMARY KEY CLUSTERED

(

       [ID] ASC

) ON [PRIMARY]

) ON [PRIMARY]

GO

 

数据:

insert TA(ID, name) values('1', 'a')

go

insert TA(ID, name) values('2', 'b')

go

insert TA(ID, name) values('3', 'c')

go

insert TA(ID, name) values('4', 'd')

go

insert TB(ID, AID, name) values('1', '1', 'aaa')

go

insert TB(ID, AID, name) values('2', '1', 'bbb')

go

insert TB(ID, AID, name) values('3', '2', 'ccc')

go

 

现按Where条件和on条件进行左外联查询,查询SQL如下:

Where条件查询:

SELECT ta.ID, ta.name, tb.AID, tb.ID 

FROM ta left outer JOIN tb ON ta.ID= tb.AID

where ta.ID='1'

 

On条件查询:

SELECT ta.ID, ta.name, tb.AID, tb.ID 

FROM ta left outer JOIN tb ON ta.ID= tb.AID and ta.ID='1'

 

查询结果如下:

 

 

 

将相应的查询SQL换成如下,结果与上边显示一样。

SELECT ta.ID, ta.name, tb.AID, tb.ID 

FROM ta left outer JOIN tb ON ta.ID= tb.AID

where tb.AID='1'

 

SELECT ta.ID, ta.name, tb.AID, tb.ID 

FROM ta left outer JOIN tb ON ta.ID= tb.AID and tb.AID='1'

分析

左联接查询时,两表通过on指定的联接条件右表无记录与左表对应的,与常量匹配的联接条件是无效的。

右外联right outer join、全联full outer join类似。

在编写查询时,要注意这类问题。

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值