sql - 这个 T-SQL 何时变得不正确?还是一直都有?

标签 sql sql-server tsql

为什么以下(最后两个)语句返回不同的结果。我几乎 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 检查仅适用于根本没有匹配 membercolorcolor

如果任何 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/

相关文章:

MySQL 多个值连接到一个表 - 更好的查询?

sql - 如何在多个条件下找出相同的值并将同一列的值放在不同的列中?

sql-server - 如何更改所有存储过程中表的架构名称

sql-server - 数据库表中的随机记录 (T-SQL)

sql - 使用不确定数量的参数时如何避免动态 SQL?

sql - 如何在 T-SQL 中分配多个内联变量?

php参数化SQL查询特殊运算符

mysql - 使用 where 子句更新或插入

r - 如何按名称在 ODBC 连接中查找表的架构?

sql - 根据多列多行数据提取数据