Oracle数据库中如何查询,删除多表关联数据

要根据条件删掉一行数据(根据单号及采购组织名称)

在这里插入图片描述
例如要删这一行 :Index_number = 0000000032
先根据条件查询到这一条数据

SELECT	* FROM JY_SUPASS_FLOW flow LEFT JOIN JYPURORG purorg ON flow.PUR_ORG_ID = purorg. ID
WHERE INDEX_NUMBER = '0000000032' AND (purorg. ID IN (SELECT purorg. ID FROM JYPURORG purorg
WHERE PURORG_NAME = '重庆大江生产物料采购组织'));

在这里插入图片描述
接着执行删除语句:delete from jy_supass_flow where id = '1000250';

[SQL]delete from jy_supass_flow where id = ‘1000250’
[Err] ORA-02292: integrity constraint (YAPP_SRM.FKRN3EIDP3AA8ALWA2HBBVAMT27) violated - child record found

本来以为利用工具找到这一行数据直接删除掉就可以了,奈何关联关系太多(别的表中有用到这一行的数据)… 删不掉
数据库中表关联如下:在这里插入图片描述
其他表中关联到该表中数据:
在这里插入图片描述
更为糟糕的是 jy_supass_result表还是一个主表,它还关联了jy_supass_result_dt明细表,所以如果要删除的话,得一次性删三张表,依次是jy_supass_result_dtjy_supass_resultjy_supass_flow

所以首先要依次查找出这三张表中的数据。因为这些表中还有其他关联关系,所以我就直接上sql了
首先是jy_supass_result_dt(可省)

SELECT
	*
	FROM
	JY_SUPASS_RESULT_DT dt
LEFT JOIN JY_SUPASS_RESULT result ON dt.sup_ass_result_id = result. ID
WHERE
	result. ID IN (
		SELECT
			result. ID
		FROM
			JY_SUPASS_RESULT result
		LEFT JOIN JY_SUPASS_Flow aaa ON result.sup_ass_flow_id = aaa. ID
		WHERE
			aaa. ID IN (
				SELECT
					flow. ID
				FROM
					JY_SUPASS_Flow flow
				LEFT JOIN JYPURORG purorg ON flow.pur_org_id = purorg. ID
				WHERE
					purorg. ID = '1000006'
			)
		AND (
			result. ID IN (
				SELECT
					result. ID
				FROM
					JY_SUPASS_RESULT result
				LEFT JOIN jy_supass_task task ON result.sup_ass_task_id = task. ID
				WHERE
					TASK.INDEX_NUMBER = '0000000032'
			)
		)
	);

然后是jy_supass_result

SELECT DISTINCT
	(aaa. ID)
FROM
	JY_SUPASS_RESULT result
LEFT JOIN JY_SUPASS_Flow aaa ON result.sup_ass_flow_id = aaa. ID
WHERE
	aaa. ID IN (
		SELECT
			flow. ID
		FROM
			JY_SUPASS_Flow flow
		LEFT JOIN JYPURORG purorg ON flow.pur_org_id = purorg. ID
		WHERE
			purorg. ID = '1000006'
	)
AND (
	result. ID IN (
		SELECT
			result. ID
		FROM
			JY_SUPASS_RESULT result
		LEFT JOIN jy_supass_task task ON result.sup_ass_task_id = task. ID
		WHERE
			TASK.INDEX_NUMBER = '0000000032'
	)
);

最后依次按照删jy_supass_result_dtjy_supass_resultjy_supass_flow这样的顺序就可以删掉啦。
不过 写delete语句的时候发现 根本就不需要查询jy_supass_result_dt表中的数据,可以直接通过主表.id来删除明细中的数据。

DELETE FROM JY_SUPASS_RESULT_DT WHERE SUP_ASS_RESULT_ID = '1000057';
DELETE FROM JY_SUPASS_RESULT WHERE id = '1000057';
DELETE FROM jy_supass_flow where id = '1000250';

ps:上面是这种是针对多表中关联关系混乱的查询语句。
如果一般查询的话,可以参照如下sql:

-- 一般写法
select * from jy_supass_flow where id = '10000';
--返回两个集合
SELECT * from JY_SUPASS_FLOW flow, JY_SUPASS_RESULT result WHERE FLOW.id = RESULT.SUP_ASS_FLOW_ID;
--使用join
SELECT * from JY_SUPASS_FLOW flow join JY_SUPASS_RESULT result ON FLOW.id = RESULT.SUP_ASS_FLOW_ID; -- WHERE
--子查询
-- 返回多条用 IN
SELECT flow.* from JY_SUPASS_FLOW flow WHERE id IN (SELECT result.id from JY_SUPASS_RESULT result);
--返回一条
SELECT flow.* from JY_SUPASS_FLOW flow WHERE id IN (SELECT result.id from JY_SUPASS_RESULT result where id=1000004);

同事还告诉了一个可以查外键关联的sql,多表关联中可以使用:

SELECT
	A .constraint_name,
	A .table_name,
	b.constraint_name
FROM
	user_constraints A,
	user_constraints b
WHERE
	A .constraint_type = 'R'
AND b.constraint_type = 'P'
AND A .r_constraint_name = b.constraint_name
AND A .constraint_name = 'FKCICV93OTPOKDYGVI0GBB9FL7J';

如果有更好的建议可以分享一下。
如有错误 希望指出(ps:小白一枚)。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值