如果属性的值包含在另一个表中,如何更新表?

时间:2013-01-13 19:37:11

标签: sql postgresql sql-update exists

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

enter image description here

我正在尝试创建一个查询,使我能够在所有这三个属性的值中更新名为“incident”的表中“status”属性的值:“tabor_vatrogasci”,“tabor_policija”和“tabor_hitna”包含在表“izvještaj_tabora”中,作为属性“oznaka_tabora”的值。例如,如果属性“tabor_vatrogasci”,“tabor_policija”和“tabor_hitna”的值分别为3,4和5,那么当且仅当包含3,4和5时,应更新表“事件”。表“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);

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

2 个答案:

答案 0 :(得分:2)

假设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'
    )

答案 1 :(得分:1)

根据您的说明,查询应如下所示:

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

  

不要写expression = NULL,因为NULL不等于“NULL”。   (null值表示未知值,但未知   两个未知值是否相等。)

2)

EXISTS(SELECT DISTINCT oznaka_tabora FROM ...)

EXISTS半联接SELECT项目中完全无关紧要。 (我使用SELECT 1代替)。如该术语所暗示的,仅检查存在。表达式返回TRUEFALSESELECT项将被忽略。在那里添加DISTINCT条款尤其毫无意义。