在关系型数据库中,关联查询中Where条件和On条件是有区别的,其中外关联查询得出的结果有可能会不一样。下边介绍示例:
现有TA、TB两个表,生成结构和数据的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类似。
在编写查询时,要注意这类问题。