Sql 从

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

上面的查询并没有提到删除行的具体方法,而是提到了一个子查询。 但此查询执行时没有任何错误,并删除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.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环境:您的查询和使用的查询没有区别