Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于多个表选择SQL删除记录_Sql_Azure_Stored Procedures - Fatal编程技术网

基于多个表选择SQL删除记录

基于多个表选择SQL删除记录,sql,azure,stored-procedures,Sql,Azure,Stored Procedures,我正试图思考如何完成这个删除查询。目标是我尝试删除一个客户记录主表,如果他们没有保险单,则删除另一个表,如果他们的需求描述是运输,并且重要性值小于5。需求是另一张桌子。它们都通过外键和SSN连接,因为连接器和删除级联工作正常。查询部分按原样工作。如果没有保险单,则客户被正确删除。然而,需求描述和重要性价值因素目前还不起作用。如果我没有保险单,它仍然会删除,但我的重要性描述是除运输之外的另一个值 这几乎就像我需要两个子查询来比较需要表和保险单表以进行删除,但我不知道如何做到这一点 我使用的数据库是

我正试图思考如何完成这个删除查询。目标是我尝试删除一个客户记录主表,如果他们没有保险单,则删除另一个表,如果他们的需求描述是运输,并且重要性值小于5。需求是另一张桌子。它们都通过外键和SSN连接,因为连接器和删除级联工作正常。查询部分按原样工作。如果没有保险单,则客户被正确删除。然而,需求描述和重要性价值因素目前还不起作用。如果我没有保险单,它仍然会删除,但我的重要性描述是除运输之外的另一个值

这几乎就像我需要两个子查询来比较需要表和保险单表以进行删除,但我不知道如何做到这一点

我使用的数据库是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
此外,以下是我的表格结构:

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
                 );