gpt4 book ai didi

SQL Where 子句排除了超出应有的范围

转载 作者:行者123 更新时间:2023-12-01 09:57:35 24 4
gpt4 key购买 nike

我有 2 个带有连接和 where 子句的表。 2 个表的示例内容:

Id         FieldA                   Id       FieldB
1 100 1 Yellow
2 100 2 Green
3 200 3 Green
4 200 4 Blue
5 300 5 Yellow
6 300 6 Orange

我正在尝试返回除 fieldA = 200 AND fieldB = Green 以外的所有内容。因此它仍应返回第 2 行,其中包含 fieldA = 100 和 FielDB = Green。但是,这是我的查询,它不起作用。它排除了所有包含 200 和绿色的行:

select t1.FieldA, t2.FieldB
FROM test1 t1
JOIN test2 t2 ON t1.Id = t2.Id
WHERE (t1.FieldA <> 200 AND t2.FieldB <> 'Green')

在我看来,在运行此查询后,唯一排除的行应该是第 3 行,因为它有 fielda = 200 和 fieldb = green,但它只返回第 1 行、第 5 行和第 6 行。在我看来,它应该只在我使用 OR 时这样做。

让我知道哪里出错了,这里有一些 DDL,您可以使用它:

create table dbo.test1
(
Id int not null,
FieldA int
)

create table dbo.test2
(
Id int not null,
FieldB varchar(10)
)

INSERT INTO test1 (Id, FieldA)
VALUES
(1,100),
(2,100),
(3,200),
(4,200),
(5,300),
(6,300)

INSERT INTO test2 (Id, FieldB)
VALUES
(1,'Yellow'),
(2,'Green'),
(3,'Green'),
(4,'Blue'),
(5,'Yellow'),
(6,'Orange')

最佳答案

每个条件都针对整组行进行独立评估。要组合它们,请翻转您的运算符并取反组合,如下所示:

select t1.FieldA, t2.FieldB
FROM test1 t1
JOIN test2 t2 ON t1.Id = t2.Id
WHERE not (t1.FieldA = 200 AND t2.FieldB = 'Green')

您的原始查询基本上是说,首先消除所有 FieldA 不是 200 的行,然后从剩余的行中消除所有 FieldB 不是“绿色”的行。

当您希望这两个条件都适用于给定行时,您首先选择要排除的条件,这就是您从 <> 切换的原因至 = , 然后让你的 WHERE子句通过应用 NOT 排除整个事情运营商。

编辑回复:评论

我认为关于您的原始查询返回的结果的混淆以及括号中的条件被“评估为一个”的想法可能源于逻辑否定不是分配的事实,即 A && B 的否定不是 ~A && ~B ,而是 ~(A && B) .

您描述所需结果的第一句话与查询的正确 t-sql 非常接近。你说“我正在尝试返回除了 fieldA = 200 AND fieldB = Green 之外的所有内容。”句子的最后一部分是您的 where 子句,即

except where fieldA = 200 AND fieldB = Green

用“不”代替“除了”

not where fieldA = 200 AND fieldB = Green
-- or, to make the grouping explicit
not (where fieldA = 200 AND fieldB = Green)

并将其清理为有效的 t-sql 语法

where not (fieldA = 200 AND fieldB = Green)

相比之下,英文相当于WHERE (t1.FieldA <> 200 AND t2.FieldB <> 'Green')可能是:返回 field1 不是 200 且 field1 不是绿色的所有内容。在这种情况下,匹配 200 或 green 就足以排除该行。

要了解第 2 行和第 4 行被错误排除的原因,请考虑原始 where 子句的真值表:

                       Field1 <> 200

T F
-----------------
T | T | F |
| | row 4 |
Field2 <> 'Green' -----------------
F | F | F |
| row 2 | |
-----------------

换句话说,第 2 行被排除在外是因为 Field2 = 'Green' , 使条件 Field2 <> 'Green'评估为 FALSE , 所以什么都没有关系 Field1是,因为 FALSE任何其他值始终为 FALSE .

关于SQL Where 子句排除了超出应有的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22617117/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com