【问题标题】:MS SQL Delete all unequal recordMS SQL 删除所有不相等的记录
【发布时间】:2016-08-30 09:51:30
【问题描述】:

我的问题是: 我有 2 个表(例如 T1T2),它们都有字段 Q_ID。表T1Q_ID 列中有一些记录不匹配T2。我的目标是将它们与关系联系起来,所以我想从T2 中删除所有行,其中Q_IDT1 中的Q_ID 不匹配。我试过像这样使用内连接,但是这个脚本只是删除了所有记录。

    DELETE dst FROM HRM_MVC_DEV_Test.dbo.ProjectWorkers as dst 
    INNER JOIN HRM_MVC_DEV_Test.dbo.Project as src on dst.ProjectId<>src.ProjectId

我使用的是 MS SQL Server 2014

【问题讨论】:

  • 顺便说一句,有人可以解释一下,为什么我的问题中的一些第一句话消失了(这个问题也在我之前的问题中) - 从一开始就消失了“嗨,伙计们”文字。
  • 因为它给问题增加了噪音。问题中不需要正式的介绍,谢谢,称呼等,只会增加噪音。社区通常会编辑问题以使其更清晰或格式化等,这些问题通常也会在遇到时被考虑并删除。请不要冒犯它,这只是论坛的设计方式以及社区成员喜欢的互动方式。

标签: sql sql-server tsql sql-server-2014 sql-delete


【解决方案1】:

可能是这样的:

CREATE TABLE T1 (ID INT, SomeValue VARCHAR(100));
CREATE TABLE T2 (ID INT, SomeValue VARCHAR(100));
INSERT INTO T1 VALUES
(1,'Row 1'),(2,'Row 2'),(3,'Row 3'),(4,'Row 4');
INSERT INTO T2 VALUES
(1,'Row 1'),(4,'Row 4');

DELETE FROM T1
WHERE T1.ID NOT IN(SELECT T2.ID FROM T2);

SELECT * FROM T1;
SELECT * FROM T2;

【讨论】:

  • 你可能想用不存在,t2中的空值会导致意想不到的结果
【解决方案2】:

您也可以通过以下任何一种方式进行:

DELETE dst 
FROM HRM_MVC_DEV_Test.dbo.ProjectWorkers AS dst 
LEFT JOIN HRM_MVC_DEV_Test.dbo.Project AS src ON src.ProjectId = dst.ProjectId
WHERE src.ProjectId IS NULL

--第二

DELETE dst 
FROM HRM_MVC_DEV_Test.dbo.ProjectWorkers AS dst 
WHERE NOT EXISTS(
    SELECT src.ProjectId FROM HRM_MVC_DEV_Test.dbo.Project AS src WHERE src.ProjectId = dst.ProjectId
)

【讨论】:

    【解决方案3】:
    DELETE
    FROM HRM_MVC_DEV_Test.dbo.ProjectWorkers
    WHERE NOT EXISTS (SELECT 1 FROM HRM_MVC_DEV_Test.dbo.Project WHERE Project.ProjectId = ProjectWorkers.ProjectId)
    

    您可以像上面那样使用 NOT EXISTS。来自documentation

    NOT EXISTS 与 EXISTS 的作用相反。如果子查询没有返回任何行,则满足 NOT EXISTS 中的 WHERE 子句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2015-11-11
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      相关资源
      最近更新 更多