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_dt
,jy_supass_result
,jy_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_dt
,jy_supass_result
,jy_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:小白一枚)。