【问题标题】:Oracle vs MS SQL UPDATE using IN SELECT使用 IN SELECT 的 Oracle 与 MS SQL UPDATE
【发布时间】:2015-03-18 19:16:49
【问题描述】:

此 SQL 在 MS SQL Server 上运行良好,但会产生错误“ORA-00907:缺少右括号”。

SQL:

UPDATE DELIVERY
SET VISIBLE = 0
WHERE DELIVERY.ID
IN 
(
    SELECT DELIVERY.ID FROM delivery WHERE DELIVERY.VISIBLE = 1
    EXCEPT
        SELECT DELIVERY.ID FROM delivery LEFT JOIN inventory ON INVENTORY.DELIVERYID = DELIVERY.ID
            WHERE ((DELIVERY.VISIBLE = 1) AND (INVENTORY.VISIBLE = 1)) AND (INVENTORY.INVENTORYSTATE = 3)
);

有没有办法让它在 Oracle 上工作,或者使用 IN 和 SELECT 语句的更新在概念上是错误的?

【问题讨论】:

  • 使用 Oracle 中存在的地方
  • @Piyush 谢谢,我现在看看...
  • IN也可以在Oracle中工作
  • OK 看看,在 Oracle 中将 EXCEPT 更改为 MINUS
  • @Piyush 谢谢,我设置 SQL 以同时使用 MS SQL 和 ORACLE 的方式,MINUS 选项似乎是最简单的解决方案。

标签: sql oracle oracle11g sql-update


【解决方案1】:

在Oracle中,IN也可以工作,只是在Oracle中把EXCEPT改成MINUS http://www.techonthenet.com/sql/update.php

http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_10007.htm

http://docs.oracle.com/cd/E17952_01/refman-5.0-en/exists-and-not-exists-subqueries.html

一个示例将是

UPDATE DELIVERY
SET VISIBLE = 0
WHERE DELIVERY.ID
IN 
(
    (SELECT DELIVERY.ID FROM delivery WHERE DELIVERY.VISIBLE = 1)
    MINUS
    (SELECT DELIVERY.ID 
    FROM delivery LEFT JOIN inventory ON INVENTORY.DELIVERYID = DELIVERY.ID
    WHERE (((DELIVERY.VISIBLE = 1) AND (INVENTORY.VISIBLE = 1)) 
          AND (INVENTORY.INVENTORYSTATE = 3)))
);

【讨论】:

  • 我认为INNER JOIN 也可以在子查询中使用,因为NULLs 将被排除在WHERE 子句中。
  • @David Faber:- OP 已经在 MSSQL 中有相同的查询,只是希望在 Oracle 中不起作用
  • 是的 - 我只是注意到 LEFT JOIN 在这里没有做任何事情 - 由于 WHERE 将不会返回 NULLs。
【解决方案2】:

我认为您可以修改此查询,使其同时在 SQL Server Oracle 中工作:

UPDATE delivery d
   SET d.visible = 0
 WHERE d.visible = 1
   AND NOT EXISTS ( SELECT 1 FROM inventory i
                     WHERE i.deliveryid = d.id
                       AND i.visible = 1
                       AND i.inventorystate = 3 )

这将更新DELIVERY 设置visible = 0,无论visible = 1,但INVENTORY 中没有对应的记录visible = 1 和inventorystate = 3。

【讨论】:

    猜你喜欢
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2014-11-26
    • 1970-01-01
    相关资源
    最近更新 更多