1

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

在此处输入图像描述

我正在尝试创建一个查询,只要所有这三个属性的值:、、和作为属性值包含在表中,我就可以更新表中的status属性值。例如,如果 、 和 属性的值分别为3、4 和 5,则当(且仅当)3、4 和 5 包含在表中时,应该更新表。incidenttabor_vatrogascitabor_policijatabor_hitnaizvještaj_taboraoznaka_taboratabor_vatrogascitabor_policijatabor_hitnaincidentizvješ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);

有谁知道如何做到这一点?

4

2 回答 2

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'
    )
于 2013-01-13T20:02:23.127 回答
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被认为是“未知”,如果将其与任何事物进行比较,结果也是“未知”。我引用了比较运算符的手册

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

2)

EXISTS(SELECT DISTINCT oznaka_tabora FROM ...)

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

于 2013-01-14T01:11:46.727 回答