Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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_Sql Server - Fatal编程技术网

Sql 从不同的表中删除记录

Sql 从不同的表中删除记录,sql,sql-server,Sql,Sql Server,你能帮我解决这个问题吗 我有三张桌子: Table Name1: Contact cnt_id, CNTName 12, test 13, test2 Table Name2: Relation cnt_id, r_grpid 12, 55 13, 55 13, 56 Table Name3: Group grp_1d, 55 56 我想做的是,当我从表组中删除组id 55时,表联系人上的记录会相应地删除。但正如您所看到的,CNT_i

你能帮我解决这个问题吗 我有三张桌子:

Table Name1: Contact

cnt_id, CNTName

12,     test
13,     test2


Table Name2: Relation

cnt_id, r_grpid

12,     55
13,     55
13,     56

Table Name3: Group

grp_1d, 

55
56
我想做的是,当我从表组中删除组id 55时,表联系人上的记录会相应地删除。但正如您所看到的,CNT_id 13也链接到另一个组。在这种情况下,不应删除CNT_id 13


关于

如果您想使用查询或存储过程,这将非常有用

declare  @groupId  int =55

delete from  Contact where cnt_id in  (select C.cnt_id from Contact C
inner  join Relation R  on R.cnt_id=C.cnt_id  where R.r_grpid =@groupId)

delete from   Relation where  r_grpid =@groupId

delete from  Group where  r_grpid =@groupId

如果您想使用查询或存储过程,这将非常有用

declare  @groupId  int =55

delete from  Contact where cnt_id in  (select C.cnt_id from Contact C
inner  join Relation R  on R.cnt_id=C.cnt_id  where R.r_grpid =@groupId)

delete from   Relation where  r_grpid =@groupId

delete from  Group where  r_grpid =@groupId

可能是触发器可以帮助您,我在sql developer中做了以下工作:

insert into contact values (12, 'abc');
insert into contact values (13, 'def');

insert into relation values (12, 55);
insert into relation values (13, 55);

insert into grouptab values (55);
然后在sqlplus中打开了一个会话

创建了一个触发器

SQL> CREATE OR REPLACE TRIGGER delete_data
  2  BEFORE delete
  3   ON grouptab
  4  REFERENCING NEW AS New OLD AS Old
  5  FOR EACH ROW
  6  DECLARE
  7  BEGIN
   delete from contact where contact_uid in (select contact_uid from relation where group_uid = :old.GROUP_uID);
END delete_data;

SQL> select * from contact;

CONTACT_UID CONTACT_NAME
----------- ------------------------------
         12 abc
         13 def

SQL> select * from relation;

CONTACT_UID  GROUP_UID
----------- ----------
         12         55
         13         55

SQL> select * from grouptab;

 GROUP_UID
----------
        55

SQL> delete from grouptab;

1 row deleted.

SQL> delete from contact;

0 rows deleted.
请尝试以下操作:


从关系rel中删除,其中group_uid在55中,1=从contact_uid=rel.contact_uid的关系中选择count*

可能是一个触发器可以帮助您,我在sql developer中做了以下工作:

insert into contact values (12, 'abc');
insert into contact values (13, 'def');

insert into relation values (12, 55);
insert into relation values (13, 55);

insert into grouptab values (55);
然后在sqlplus中打开了一个会话

创建了一个触发器

SQL> CREATE OR REPLACE TRIGGER delete_data
  2  BEFORE delete
  3   ON grouptab
  4  REFERENCING NEW AS New OLD AS Old
  5  FOR EACH ROW
  6  DECLARE
  7  BEGIN
   delete from contact where contact_uid in (select contact_uid from relation where group_uid = :old.GROUP_uID);
END delete_data;

SQL> select * from contact;

CONTACT_UID CONTACT_NAME
----------- ------------------------------
         12 abc
         13 def

SQL> select * from relation;

CONTACT_UID  GROUP_UID
----------- ----------
         12         55
         13         55

SQL> select * from grouptab;

 GROUP_UID
----------
        55

SQL> delete from grouptab;

1 row deleted.

SQL> delete from contact;

0 rows deleted.
请尝试以下操作:


从关系rel中删除,其中group_uid在55中,1=从contact_uid=rel.contact_uid的关系中选择count*

如果cnt_id和r_grpid的组合是唯一的,您可以使用前面建议的查询,但在cnt_id上有一个额外的过滤器,如下所示:

declare  @groupId  int =55

delete from  Contact where cnt_id in  (select C.cnt_id from Contact C
inner  join Relation R  on R.cnt_id=C.cnt_id  where R.r_grpid =@groupId AND cnt_id not in (select cnt_id from Relation group by cnt_id having count(*) > 1))

delete from   Relation where  r_grpid =@groupId AND cnt_id not in (select cnt_id from Relation group by cnt_id having count(*) > 1)

delete from  Group where  r_grpid =@groupId 

如果cnt_id和r_grpid的组合是唯一的,则可以使用前面建议的查询,但在cnt_id上有一个附加筛选器,如下所示:

declare  @groupId  int =55

delete from  Contact where cnt_id in  (select C.cnt_id from Contact C
inner  join Relation R  on R.cnt_id=C.cnt_id  where R.r_grpid =@groupId AND cnt_id not in (select cnt_id from Relation group by cnt_id having count(*) > 1))

delete from   Relation where  r_grpid =@groupId AND cnt_id not in (select cnt_id from Relation group by cnt_id having count(*) > 1)

delete from  Group where  r_grpid =@groupId 

如果它们也属于不同的组怎么办?删除级联是实现这一点的方法之一。请参阅:好的,Delete cascade将只删除关系表中的记录,它也不会删除联系人表中的记录…如果它属于另一个组,则只需跳过从联系人表中删除。如果它们也属于另一个组,该怎么办?删除cascade是执行此操作的方法之一。请参阅:AFAIK,Delete cascade将只删除关系表中的记录,它也不会删除联系人表中的记录…如果它属于另一个组,则只需跳过从表联系人中删除即可。非常感谢它的工作组。如果在表关系中,另一个组链接到同一个联系人id,该怎么办?在这种情况下,是否有方法跳过删除该号码?非常感谢如果在表关系中,另一个组链接到同一个联系人id,该怎么办?在这种情况下,有没有办法跳过删除该号码的步骤?嗨,谢谢你的回答,但它似乎非常复杂,而且它没有达到我期望的效果。第二个答案几乎给出了我想要的,如果你能编辑的话,我很感激。嗨,谢谢你的回答,但是它看起来很复杂,而且它没有达到我期望的效果。第二个答案是,如果你能编辑它,我会很感激你的。