根据多个 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
我想你想要 Needs
和 Insurance_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
);
我正在思考如何完成此删除查询。目标是我试图根据客户记录(主要 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
我想你想要 Needs
和 Insurance_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
);