根据多个 table 选择 SQL 删除一条记录

Delete a record based on multiple table choices SQL

我正在思考如何完成此删除查询。目标是我试图根据客户记录(主要 table)是否没有保险单(另一个 table)以及他们的需求描述是否为“交通”和重要性来删除客户记录(主要 table) values 小于 5。需要的是另一个 table。它们都与外键和 SSN 连接,因为连接器和删除级联正常工作。查询部分按原样工作。如果没有保险单,则正确删除Client。但是,需求描述和重要性值因素目前不起作用。如果我没有保单,它仍然会删除,但我的重要性描述是交通以外的另一个价值。

这几乎就像我需要 2 个子查询比较需要 table 和 Insurance_Policy table 删除,但我不知道该怎么做。

我使用的数据库是 Azure Data Studio

这是我当前的程序代码:

DROP PROCEDURE IF EXISTS Option17;
GO

CREATE PROCEDURE Option17
AS
BEGIN
    DELETE FROM Client
    WHERE Client.SSN NOT IN (SELECT I.SSN 
                             FROM Insurance_Policy I, Needs N
                             WHERE Client.SSN = I.SSN 
                               AND Client.SSN = N.SSN 
                               AND N.need_description = 'transportation' 
                               AND N.importance_value < 5)
END

此外,这是我的 table 结构:

CREATE TABLE Client 
(
    SSN VARCHAR(9),
    doctor_name VARCHAR(60),
    doctor_phone_no VARCHAR(10),
    lawyer_name VARCHAR(60),
    lawyer_phone_no VARCHAR(10),
    date_assigned DATE,

    PRIMARY KEY (SSN),
    FOREIGN KEY (SSN) REFERENCES Person
        ON DELETE CASCADE
);

CREATE TABLE Insurance_Policy 
(
    policy_id VARCHAR(10),
    provider_id VARCHAR(10),
    provider_address VARCHAR(100),
    insurance_type VARCHAR(10),
    SSN VARCHAR(9),

    PRIMARY KEY (policy_id),
    FOREIGN KEY (SSN) REFERENCES Client,
);

CREATE TABLE Needs 
(
    SSN VARCHAR(9),
    need_description VARCHAR(60),
    importance_value INT CHECK(importance_value > 0 and importance_value <11),
    PRIMARY KEY(SSN,need_description),
    FOREIGN KEY(SSN) REFERENCES Client
        ON DELETE CASCADE
);

如果格式不符合程序,这里是屏幕截图。

enter image description here

根据您的回答,我相信这就是您要查找的代码。如果这不起作用,请告诉我。

稍微解释一下,使用 INNER 联接将消除对其中几个 WHERE 条件的需要。仅 INNER JOIN returns 记录它在两个 table 中存在的位置。也不需要从子查询中 link 到客户端 table。

您还想要其中没有重要性小于 5 的交通工具的描述。由于您要拉出一个单独的列表,因此您不想包含这些记录。

DROP PROC IF EXISTS Option17;
GO
Create proc Option17
AS
BEGIN
    DELETE FROM Client
    WHERE SSN NOT IN (
        SELECT
            N.SSN
        FROM Needs N
            INNER JOIN Insurance_Policy I ON N.SSN = I.SSN
        WHERE NOT (N.need_description = 'transportation' AND N.importance_value < 5)
    );
END
GO

我想你想要 NeedsInsurance_Policy 上的单独条件。我推荐 NOT EXISTS,因为它能更好地处理 NULL 值:

DELETE c
    FROM Client c
    WHERE NOT EXISTS (SELECT 1
                      FROM Insurance i
                      WHERE c.SSN = i.SSN 
                     ) AND
          EXISTS (SELECT 1
                  FROM Needs n
                  WHERE c.SSN = n.SSN AND
                        n.need_description = 'transportation' AND
                        n.importance_value < 5
                 );