Sql 从
上面的查询并没有提到删除行的具体方法,而是提到了一个子查询。 但此查询执行时没有任何错误,并删除order_item1表行 oracle server如何决定应删除哪些表行? 为什么不能删除orders1表行?这可能会对您有所帮助Sql 从,sql,oracle,oracle11g,oracle10g,Sql,Oracle,Oracle11g,Oracle10g,上面的查询并没有提到删除行的具体方法,而是提到了一个子查询。 但此查询执行时没有任何错误,并删除order_item1表行 oracle server如何决定应删除哪些表行? 为什么不能删除orders1表行?这可能会对您有所帮助 从orders1 o交叉连接order\u item1 i中删除,其中i.order\u id=o.order\u id在您的子查询中,您给出了i.order\u id=o.order\u id。您可以这样尝试 从选择中删除*从订单1 o,订单1 i 其中o.orde
从orders1 o交叉连接order\u item1 i中删除,其中i.order\u id=o.order\u id在您的子查询中,您给出了i.order\u id=o.order\u id。您可以这样尝试 从选择中删除*从订单1 o,订单1 i 其中o.order\u id=i.order\u id
这将是正确的我目前没有访问Oracle环境的权限,因此无法验证,但以下内容在SQL Server中确实有效,并将从Orders表中删除。如果要从订单项目中删除,请反转表格
DELETE FROM (SELECT * FROM orders1 o,order_item1 i
WHERE i.order_id = o.order_id );
在您的例子中,子查询的表orders1肯定有一个主键 order_id和表order_item1具有相应的外键order_id 因此,Oracle将表order_item1转换为键保留表,并能够在EXTER delete语句中从此表中删除 键保留表的概念将在中进一步解释 如果你想知道删除了什么,你可以这样做 以下是在子查询中联接的表:
DELETE o
FROM Orders o
JOIN Order_Item oi ON o.order_id = oi.order_id
WHERE [filter condition]
create table tq84_orders1 (
id number primary key,
col_1 varchar2(10),
col_2 date
);
create table tq84_order_item1 (
order_id references tq84_orders1,
col_3 varchar2(10),
col_4 date
);
此视图模拟子查询:
DELETE o
FROM Orders o
JOIN Order_Item oi ON o.order_id = oi.order_id
WHERE [filter condition]
create table tq84_orders1 (
id number primary key,
col_1 varchar2(10),
col_2 date
);
create table tq84_order_item1 (
order_id references tq84_orders1,
col_3 varchar2(10),
col_4 date
);
此用户可更新列查询现在可以查找哪些列实际被删除或可以删除:
create view tq84_orders_v as (
select *
from
tq84_orders1 o,
tq84_order_item1 i
where
o.id = i.order_id
);
结果表明,实际上可以删除ORDER_ID、COL_3和COL_4这三列,它们都来自TQ84_ORDER_ITEM1
select
table_name,
column_name,
--updatable,
--insertable,
deletable
from
user_updatable_columns
where
table_name = 'TQ84_ORDERS_V';
我认为,如果只想从一个表中删除行,可以使用以下查询:
TABLE_NAME COLUMN_NAME DEL
------------------------------ ------------------------------ ---
TQ84_ORDERS_V ID NO
TQ84_ORDERS_V COL_1 NO
TQ84_ORDERS_V COL_2 NO
TQ84_ORDERS_V ORDER_ID YES
TQ84_ORDERS_V COL_3 YES
TQ84_ORDERS_V COL_4 YES
但如果要从两个表中删除行,可以执行以下操作:
DELETE FROM orders1 WHERE order_id in
(SELECT o.order_id FROM orders1 o,order_item1 i
WHERE i.order_id = o.order_id );
我认为这会触发ORA-01752:如果没有保留一个键的表,则无法从视图中删除。@MaheswaranRavisankar:如果未定义主键,则会收到此错误消息。另外,如果两个表都有主键,则会删除from子句中第一个指定的表@MaheswaranRavisankar:我假设如果使用现代显式连接而不是过时的隐式连接,它将从from子句中指定的表中删除,而不是join子句中指定的表,对吗?@a_horse_和_no_name是有意义的。又一个例子证明了现代语法的概念!这在Oracle中不起作用,因为它不允许在DELETE语句中使用联接。我绝对肯定你不想从两个表的笛卡尔乘积中删除-即使你在whereNo中使用过时的隐式连接语法将交叉连接转换为内部连接,这是行不通的。Oracle不允许在delete语句的from子句中使用联接。顺便说一句:这是一个Oracle环境:您的查询和使用的查询没有区别