【问题标题】:Changing SQL SELECT to UPDATE将 SQL SELECT 更改为 UPDATE
【发布时间】:2018-10-04 10:24:50
【问题描述】:

我不经常使用 SQL UPDATE,而且对于如何重写此 SELECT 以进行更新,我有一个完整的大脑障碍。

基本上我想用KUST_ADR.KU_EMAIL的结果替换AUF_ADR.EMAIL

SELECT AUF_KOPF.AUF_NR, 
       AUF_ADR.EMAIL, 
       KUST_ADR.KU_EMAIL 
FROM   AUF_ADR, 
       AUF_KOPF, 
       AUF_STAT, 
       KUST_ADR 
WHERE  AUF_ADR.AUF_NR = AUF_KOPF.AUF_NR 
       AND AUF_ADR.AUF_NR = AUF_STAT.AUF_NR 
       AND AUF_KOPF.KUNR = KUST_ADR.KU_NR 
       AND AUF_ADR.ADR_ART = 2 
       AND KUST_ADR.KU_ADR_ART = 1 
       AND AUF_ADR.EMAIL != KUST_ADR.KU_EMAIL
       AND (SELECT SUM(AUF_STAT.RG_ANZ) 
            FROM   AUF_STAT 
            WHERE  AUF_STAT.AUF_NR = AUF_KOPF.AUF_NR) = 0;

我知道我需要从类似的东西开始

UPDATE AUF_ADR
SET    AUF_ADR.EMAIL = KUST_ADR.KU_EMAIL

但这就是我不明白接下来会发生什么的地方,即我没有在UPDATE 中使用FROM,那么WHERE 呢?

【问题讨论】:

  • 可以参考这个话题link
  • 使用 ANSI join 语法而不是隐式的 a,b,c,d 进行连接。然后将您的查询转换为MERGE INTO 语句。
  • 请提供一些简化的 DDL 代码,包括约束,以便可以看到表是如何“连接”的。我写了一个例子——见dbfiddle.uk/…

标签: oracle join sql-update oracle10g


【解决方案1】:

大概是这样的吧?我只是重写了你的代码; EXISTS 用于防止将不匹配的电子邮件地址设置为 NULL。

UPDATE auf_adr
   SET email =
          (SELECT kust_adr.ku_email
             FROM auf_kopf, auf_stat, kust_adr
            WHERE     auf_adr.auf_nr = auf_kopf.auf_nr
                  AND auf_adr.auf_nr = auf_stat.auf_nr
                  AND auf_kopf.kunr = kust_adr.ku_nr
                  AND auf_adr.adr_art = 2
                  AND kust_adr.ku_adr_art = 1
                  AND auf_adr.email != kust_adr.ku_email
                  AND (SELECT SUM (auf_stat.rg_anz)
                         FROM auf_stat
                        WHERE auf_stat.auf_nr = auf_kopf.auf_nr) = 0)
 WHERE EXISTS
          (SELECT NULL
             FROM auf_kopf, auf_stat, kust_adr
            WHERE     auf_adr.auf_nr = auf_kopf.auf_nr
                  AND auf_adr.auf_nr = auf_stat.auf_nr
                  AND auf_kopf.kunr = kust_adr.ku_nr
                  AND auf_adr.adr_art = 2
                  AND kust_adr.ku_adr_art = 1
                  AND auf_adr.email != kust_adr.ku_email
                  AND (SELECT SUM (auf_stat.rg_anz)
                         FROM auf_stat
                        WHERE auf_stat.auf_nr = auf_kopf.auf_nr) = 0);

【讨论】:

  • ORA-01427: 单行子查询返回多行
  • 这取决于你;我不知道您编写的 SELECT 返回什么 - 显然,不仅仅是一个值。 DISTINCT 可能会有所帮助,但 - 另一方面 - 它可能不会。如果没有,您将不得不进一步限制 WHERE 子句,使其真正只返回一个值。
  • 有没有一种快速的方法来确定哪一列导致了额外的行?大表,大数据库!
  • 也许通过使用 GROUP BY 和 HAVING COUNT(*) > 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2018-01-26
  • 2020-01-25
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
相关资源
最近更新 更多