基于多个表选择SQL删除记录
我正试图思考如何完成这个删除查询。目标是我尝试删除一个客户记录主表,如果他们没有保险单,则删除另一个表,如果他们的需求描述是运输,并且重要性值小于5。需求是另一张桌子。它们都通过外键和SSN连接,因为连接器和删除级联工作正常。查询部分按原样工作。如果没有保险单,则客户被正确删除。然而,需求描述和重要性价值因素目前还不起作用。如果我没有保险单,它仍然会删除,但我的重要性描述是除运输之外的另一个值 这几乎就像我需要两个子查询来比较需要表和保险单表以进行删除,但我不知道如何做到这一点 我使用的数据库是Azure Data Studio 以下是我当前的程序代码:基于多个表选择SQL删除记录,sql,azure,stored-procedures,Sql,Azure,Stored Procedures,我正试图思考如何完成这个删除查询。目标是我尝试删除一个客户记录主表,如果他们没有保险单,则删除另一个表,如果他们的需求描述是运输,并且重要性值小于5。需求是另一张桌子。它们都通过外键和SSN连接,因为连接器和删除级联工作正常。查询部分按原样工作。如果没有保险单,则客户被正确删除。然而,需求描述和重要性价值因素目前还不起作用。如果我没有保险单,它仍然会删除,但我的重要性描述是除运输之外的另一个值 这几乎就像我需要两个子查询来比较需要表和保险单表以进行删除,但我不知道如何做到这一点 我使用的数据库是
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
此外,以下是我的表格结构:
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
);
这里是一个屏幕截图,如果格式化在过程中不起作用
根据您的回答,我相信这就是您正在寻找的代码。如果这不起作用,请告诉我 稍微解释一下,使用内部联接将消除对两个WHERE条件的需要。内部联接只返回两个表中存在的记录。此外,不需要从子查询中链接到客户机表 此外,您还需要一个重要度小于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
我想你需要在需求和保险单上分开。我建议不存在,因为它可以更好地处理空值:
您使用的是什么数据库引擎?答案将根据是否是MSSQL、MySQL、Postgres等而有所不同。我使用的是Azure SQL。您如何判断他们是否有保险单?保险单表中是否只填充了有保险单的人员25多年前,在ANSI-92 SQL标准中,旧样式的逗号分隔表列表样式被正确的ANSI连接语法所取代,不鼓励使用它谢谢。我将在今晚晚些时候尝试一下,并检查是否工作正常。谢谢你抽出时间!我还附上了我的表格,以便更好地参考。
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
);