开发者社区 问答 正文

尝试仅在where条件下定义左联接

我尝试找到特定的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条件是没有办法的。但是,仅重写条件条件是该特殊应用程序中的最佳方法。

展开
收起
心有灵_夕 2019-12-25 21:38:48 959 分享 版权
1 条回答
写回答
取消 提交回答
  • 曾几何时,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,但是它们需要对查询进行更多的操作。但是,还有一个不错的选择,那就是使用正确的现代语法编写查询。

    2019-12-25 21:39:04
    赞同 展开评论
问答分类:
问答地址: