【问题标题】:Difference between delete statements删除语句之间的区别
【发布时间】:2022-01-21 07:26:47
【问题描述】:
DELETE a
FROM TableA a
JOIN TableB b ON a.Field1 = b.Field1 AND a.Field2 = b.Field2;

对比

DELETE
FROM TableA
WHERE Field1 IN (
    SELECT Field1
    FROM TableB
) AND Field2 IN (
    SELECT Field2
    FROM TableB
);

【问题讨论】:

  • 你的问题到底是什么?
  • 第一个删除语句更精确,因为 Field1 和 Field2 必须在 TableB 的同一行内匹配。第二个 delete 语句可能会删除意外的行,因为 Field1 和 Field2 可以匹配 TableB 中的不同行。
  • @DaleK 两个查询的区别
  • 你无法解决的差异是什么?你问他们是否删除不同的记录?如果他们的表现不同?上下文是什么?您是如何遇到 2 个您不确定的查询的?实际的最终目标是什么?

标签: sql sql-server tsql


【解决方案1】:

两个语句的逻辑条件不同。

如果Field1Field2 都对应TableB 中一行的等效列,第一条语句将删除TableA 中的任何行。

如果Field1 的值存在于TableBField1 中,并且Field2 的值存在于Field2TableB 中,则第二条语句将删除TableA 中的任何行 - 但那不必在同一行。

如果将delete 更改为select,很容易看出区别。

这是一个例子。首先,创建并填充示例表(在您以后的问题中保存我们这一步):

CREATE TABLE A 
(
    AInt int,
    AChar char(1)
);

CREATE TABLE B
(
    BInt int,
    BChar char(1)
);

INSERT INTO A (AInt, AChar) VALUES
(1, 'a'), (2, 'a'), (3, 'a'),
(1, 'b'), (2, 'b'), (3, 'b');


INSERT INTO B (BInt, BChar) VALUES
(1, 'a'),
(2, 'b'),
(3, 'c');

声明(翻译成select声明):

SELECT A.*
FROM A
JOIN B 
    ON AInt = BInt AND AChar = BChar;


SELECT *
FROM A
WHERE AInt IN (
    SELECT BInt
    FROM B
) AND AChar IN (
    SELECT BChar
    FROM B
);

结果:

AInt    AChar
1       a
2       b


AInt    AChar
1       a
2       a
3       a
1       b
2       b
3       b

你可以在DB<>Fiddle看到现场演示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-11
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多