1

次のようなデータベースがあります。

ここに画像の説明を入力

、、およびの 3 つの属性すべての値が属性の値としてテーブル内に含まれている場合に、テーブル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が操作に無関係なのだろうか。

とりわけ、あなたは 2 つの広く行き渡った誤解の犠牲になりました。

1)

tabor_policija=NULL

この式は になりNULLます。は「不明」とみなされるためNULL、何かと比較すると、結果も「不明」になります。比較演算子に関するマニュアルを引用します。

NULL は NULL と「等しい」わけではないため、expression = NULL を記述しないでください。(null 値は不明な値を表し、2 つの不明な値が等しいかどうかはわかりません。)

2)

EXISTS(SELECT DISTINCT oznaka_tabora FROM ...)

EXISTS準結合では、SELECT項目はまったく無関係です。(私はSELECT 1代わりに使用します)。用語が示すように、存在のみがチェックされます。TRUE式はorFALSEを返しますSELECT。項目は無視されます。DISTINCTそこに句を追加することは特に無意味です。

于 2013-01-14T01:11:46.727 に答える