Sql 如果属性值包含在另一个表中,如何更新表?
我有一个这样的数据库: 我试图创建一个查询,使我能够在izvještajšu tabora表中包含所有这三个属性(tabor_Vatrogasi、tabor_policija和tabor_hitna)的值作为oznaka_tabora属性的值时,更新incident表中status属性的值。例如,如果taborêVatrogasi、taborêpolicija和taborêhitna属性的值分别为3、4和5,则当且仅当izvještajêtabora表中包含3、4和5时,应更新事件表 这是我尝试过的,但没有成功:Sql 如果属性值包含在另一个表中,如何更新表?,sql,postgresql,sql-update,exists,Sql,Postgresql,Sql Update,Exists,我有一个这样的数据库: 我试图创建一个查询,使我能够在izvještajšu tabora表中包含所有这三个属性(tabor_Vatrogasi、tabor_policija和tabor_hitna)的值作为oznaka_tabora属性的值时,更新incident表中status属性的值。例如,如果taborêVatrogasi、taborêpolicija和taborêhitna属性的值分别为3、4和5,则当且仅当izvještajêtabora表中包含3、4和5时,应更新事件表 这是我尝试
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);
有人知道如何做到这一点吗?发生意外事件。奥兹纳卡是关键,你需要所有三个方面都有关联才能让活动开始,我是斯洛文尼亚人,这就是我理解的原因
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'
)
根据您的描述,查询应如下所示:
更新事件一
设置状态='Otvoren'
其中tabor_policija为NULL或
存在
从izvjestaj_tabora t中选择1
其中t.oznaka_tabora=i.tabor_policija
tabor_vatrogasci为空或
存在
从izvjestaj_tabora t中选择1
其中t.oznaka_tabora=i.tabor_vatrogasci
tabor_hitna为空或
存在
从izvjestaj_tabora t中选择1
其中t.oznaka_tabora=i.tabor_hitna
但是,我想知道为什么连接表tabor与操作无关
除此之外,你还受到了两种普遍存在的误解的影响:
一,
tabor_=NULL
此表达式将导致NULL。由于NULL被认为是未知的,如果将其与任何东西进行比较,结果也是未知的。我引述:
不要写入表达式=NULL,因为NULL不等于NULL。
空值表示未知值,它是未知的
两个未知值是否相等
二,
存在选择不同的oznaka_tabora从。。。
在半联接中,选择项是完全不相关的。我改用select1。正如这个术语所暗示的,只有存在是被检查的。表达式返回TRUE或FALSE,选择项将被忽略。在那里添加一个独特的子句是毫无意义的。您能更具体地说明一下没有起作用吗?@Quassnoi:更新没有起作用,因为至少有一个子查询的结果等于false。谢谢。现在我尝试在属性tabor_vatrogasci、tabor_policija、tabor_hitna的值可能等于NULL时应用它。在这种情况下,我该如何写下来?谢谢你提供了非常详细的答案。是的,确实如此。再次感谢。