【问题标题】:How to update a table if values of the attributes are contained within another table?如果属性值包含在另一个表中,如何更新表?
【发布时间】:2012-12-27 18:11:43
【问题描述】:

我有一个像这样的数据库:

我正在尝试创建一个查询,使我能够更新incident 表中status 属性的值,只要所有这三个属性的值:tabor_vatrogascitabor_policijatabor_hitna 包含在 izvještaj_tabora 表中,作为 oznaka_tabora 属性的值。例如,如果 tabor_vatrogascitabor_policijatabor_hitna 属性的值分别为 3、4 和 5,则应(且仅当)3、4 和 5 时更新 incident 表包含在izvještaj_tabora 表中。

这是我尝试过的,但没有奏效:

UPDATE incident SET status='Otvoren' FROM tabor,izvjestaj_tabora
WHERE (incident.tabor_policija=tabor.oznaka
OR incident.tabor_vatrogasci=tabor.oznaka
OR incident.tabor_hitna=tabor.oznaka)
AND izvjestaj_tabora.oznaka_tabora=tabor.oznaka
AND rezultat_izvjestaja='Riješen' AND
((SELECT EXISTS(SELECT DISTINCT oznaka_tabora FROM izvjestaj_tabora)
WHERE oznaka_tabora=incident.tabor_policija) OR tabor_policija=NULL) AND
((SELECT EXISTS(SELECT DISTINCT oznaka_tabora FROM izvjestaj_tabora)
WHERE oznaka_tabora=incident.tabor_vatrogasci) OR tabor_vatrogasci=NULL) AND
((SELECT EXISTS(SELECT DISTINCT oznaka_tabora FROM izvjestaj_tabora)
WHERE oznaka_tabora=incident.tabor_hitna) OR tabor_hitna=NULL);

有没有人知道如何做到这一点?

【问题讨论】:

  • 能否请您更具体地说明“没用”?
  • @Quassnoi:更新无效,因为至少有一个子查询的结果等于false

标签: sql postgresql sql-update exists


【解决方案1】:

假设INCIDENT.OZNAKA 是关键,您需要将所有 3 人都联系起来才能开始活动(我是斯洛文尼亚人,所以我理解 ;))

UPDATE incident
SET status='Otvoren' 
WHERE oznaka in (
    SELECT DISTINCT i.oznaka
    FROM incident i
        INNER JOIN izvještaj_tabora t1 ON i.tabor_vatrogasci = t1.oznaka_tabora
        INNER JOIN izvještaj_tabora t2 ON i.tabor_policija = t2.oznaka_tabora
        INNER JOIN izvještaj_tabora t3 ON i.tabor_hitna = t3.oznaka_tabora
    WHERE t1.rezultat_izvjestaja='Riješen' AND t2.rezultat_izvjestaja='Riješen' AND t3.rezultat_izvjestaja='Riješen'
    )

【讨论】:

  • 谢谢。现在,当属性之一(“tabor_vatrogasci”、“tabor_policija”、“tabor_hitna”)的值可能等于NULL 时,我尝试应用它。在这种情况下我该如何写下来?
【解决方案2】:

根据您的描述,查询应如下所示:

UPDATE incident i
SET    status = 'Otvoren'
WHERE (tabor_policija IS NULL OR
       EXISTS ( 
          SELECT 1 FROM izvjestaj_tabora t
          WHERE  t.oznaka_tabora = i.tabor_policija
          )
       )
AND   (tabor_vatrogasci IS NULL OR
       EXISTS ( 
          SELECT 1 FROM izvjestaj_tabora t
          WHERE  t.oznaka_tabora = i.tabor_vatrogasci
          )
       )
AND   (tabor_hitna IS NULL OR
       EXISTS ( 
          SELECT 1 FROM izvjestaj_tabora t
          WHERE  t.oznaka_tabora = i.tabor_hitna
          )
       )

我想知道,为什么连接表tabor与操作无关。

除其他外,您还成为两个普遍误解的受害者:

1)

tabor_policija=NULL

这个表达式会产生NULL。由于NULL 被认为是“未知”,如果将其与任何东西进行比较,结果也是“未知”。我引用the manual on Comparison Operators

不要写表达式 = NULL,因为 NULL 不“等于”NULL。 (空值代表未知值,不知道 两个未知值是否相等。)

2)

EXISTS(SELECT DISTINCT oznaka_tabora FROM ...)

EXISTS 半连接SELECT 中,项目完全不相关。 (我改用SELECT 1)。正如该术语所暗示的,仅检查存在。表达式返回 TRUEFALSESELECT 项目被忽略。在那里添加DISTINCT 子句特别没有意义。

【讨论】:

  • 感谢您提供非常详细的答复。
  • 是的,确实如此。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
相关资源
最近更新 更多