我有一个像这样的数据库:
我正在尝试创建一个查询,使我能够在所有这三个属性的值中更新名为“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);
有没有人知道如何做到这一点?
答案 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
代替)。如该术语所暗示的,仅检查存在。表达式返回TRUE
或FALSE
,SELECT
项将被忽略。在那里添加DISTINCT
条款尤其毫无意义。