为什么以下(最后两个)语句返回不同的结果。我几乎 100% 确信它们“曾经”返回相同的结果(有人还记得 SQL Server 6/2000 中的情况是怎样的吗?)。
CREATE TABLE [dbo].[color](
[colorid] [int] NOT NULL,
[title] [varchar](255) NOT NULL
) ON [PRIMARY]
INSERT color SELECT 1,'Red' UNION ALL SELECT 2,'Green' UNION ALL SELECT 3,'Blue'
CREATE TABLE [dbo].[membercolor](
[memberid] [int] NOT NULL,
[colorid] [int] NOT NULL
) ON [PRIMARY]
INSERT membercolor SELECT 10,1 UNION ALL SELECT 10,2 UNION ALL SELECT 10,3 UNION ALL SELECT 11,1 UNION ALL SELECT 11,2 UNION ALL SELECT 12,1
SELECT * FROM color
SELECT * FROM membercolor
-- red, green & blue
SELECT * FROM color a LEFT JOIN membercolor b
ON a.colorid=b.colorid AND b.memberid=11
-- red, green - but why?
SELECT * FROM color a LEFT JOIN membercolor b
ON a.colorid=b.colorid WHERE b.memberid IS NULL OR b.memberid=11
最佳答案
is null
检查仅适用于根本没有匹配 membercolor
的 color
。
如果任何 membercolor
匹配,您最终会得到如下结果集:
color blue memberid 8
color blue memberid 9
color blue memberid 10
应用 where
子句过滤掉所有蓝色行:
memberid IS NULL OR b.memberid=11
如果没有 membercolor
匹配,结果集如下所示:
color blue memberid NULL
where
子句将允许此传递。
关于sql - 这个 T-SQL 何时变得不正确?还是一直都有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5897043/