我尝试找到特定的SQL语句来替换旧的SQL查询。总而言之,我尝试仅在满足条件的情况下进行左连接。这是我的测试环境:
create table Mst
(
Id bigint not null primary key clustered,
Firstname nvarchar(200) not null,
Lastname nvarchar(200) not null
);
create table Dtl
(
Id bigint not null primary key clustered,
MstId bigint not null references Mst(Id),
DetailDescr nvarchar(500) not null
);
我用一些数据填充表格:
declare @i as bigint = 0;
while @i < 999
begin
insert into Mst values (@i, N'Name ' + Str(@i), N'Lastname ' + Str(@i));
if (@i % 10 = 0)
insert into Dtl values (@i*5+0, @i, N'Description 1 for ' + Str(@i));
if (@i % 2 = 0)
insert into Dtl values (@i*5+1, @i, N'Description 2 for ' + Str(@i));
if (@i % 3 = 0)
insert into Dtl values (@i*5+2, @i, N'Description 3 for ' + Str(@i));
set @i = @i + 1;
end;
左联接的通常方法是:
select m.Id, m.Firstname, m.Lastname, d.DetailDescr
From Mst m left join Dtl d
on m.id = d.MstId;
该查询返回1266行。但是在我尝试迁移的旧应用程序中,select和from部分仍然是预定义的:
select m.Id, m.Firstname, m.Lastname, d.DetailDescr
From Mst m, Dtl d
对于内部联接,where条件很容易定义:
where m.id = d.MstId
但是我需要一个左联接,我发现仅修改where条件是没有办法的。但是,仅重写条件条件是该特殊应用程序中的最佳方法。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
曾几何时,SQL不支持外部联接语法。这是一个古老的世界,电话通过电线连接到墙上,欧洲的每个县都有自己的货币,大多数美国人在电视上观看三到四个主要网络之一。
当时,Microsoft甚至没有真正的数据库。但是Sybase在该WHERE子句中提供了一个外部*=联接运算符,Microsoft最终将该子句适应了SQL Server。Microsoft SQL Server通过SQL Server 2008支持此功能。 因此,在WHERE子句中,没有受支持的SQL Server版本支持外部联接。
令人高兴的是,现在存在一种更好的标准语法(至少我们很沮丧,认为随着时间的推移事情不会变得更好)。FROM子句中的“逗号运算符” 降级为其原始定义-a CROSS JOIN。该CROSS JOIN过滤掉非匹配。例如,如果Dtl没有行,则不CROSS JOIN返回任何行。
就是说,没有办法在WHERE子句中做您想做的一般事情。有些查询可以复制一个外部查询JOIN,但是它们需要对查询进行更多的操作。但是,还有一个不错的选择,那就是使用正确的现代语法编写查询。