sql >> Database >  >> RDS >> PostgreSQL

Instructie bijwerken met een WHERE-clausule die kolommen met null-waarden bevat

Aangezien null =null evalueert tot false je moet controleren of twee velden beide null zijn naast gelijkheidscontrole:

UPDATE table_one SET table_one.x = table_two.y 
FROM table_two
WHERE 
    (table_one.invoice_number = table_two.invoice_number 
        OR (table_one.invoice_number is null AND table_two.invoice_number is null))
    AND
    (table_one.submitted_by = table_two.submitted_by 
        OR (table_one.submitted_by is null AND table_two.submitted_by is null))
    AND 
    -- etc

U kunt ook de samenvloeien functie die beter leesbaar is:

UPDATE table_one SET table_one.x = table_two.y 
FROM table_two
WHERE 
    coalesce(table_one.invoice_number, '') = coalesce(table_two.invoice_number, '')
    AND coalesce(table_one.submitted_by, '') = coalesce(table_two.submitted_by, '')
    AND -- etc

Maar je moet voorzichtig zijn met de standaardwaarden (laatste argument om samen te voegen ).
Het gegevenstype moet overeenkomen met het kolomtype (zodat u bijvoorbeeld geen datums met getallen gaat vergelijken) en de standaardinstelling moet zodanig zijn dat het niet in de gegevens verschijnt
Bijvoorbeeld coalesce(null, 1) =coalesce(1, 1) is een situatie die u wilt vermijden.

Update (met betrekking tot prestaties):

Seq Scan op table_two - dit suggereert dat je geen indexen hebt op table_two .
Dus als je een rij bijwerkt in table_one om vervolgens een overeenkomende rij te vinden in table_two de database moet in principe alle rijen één voor één doorzoeken totdat deze een overeenkomst vindt.
De overeenkomende rijen zouden veel sneller gevonden kunnen worden als de relevante kolommen waren geïndexeerd.

Aan de andere kant als table_one heeft indexen die de update vertragen.
Volgens deze prestatiegids :

Een andere suggestie uit dezelfde gids die nuttig kan zijn, is:

Dus bijvoorbeeld als table_one een id kolom zou je zoiets kunnen toevoegen als

and table_one.id between x and y

naar de waar voorwaarde en voer de query meerdere keren uit en verander de waarden van x en y zodat alle rijen bedekt zijn.

Misschien wilt u voorzichtig zijn bij het gebruik van de ANALYSE optie met UITLEG bij het omgaan met verklaringen met neveneffecten.Volgens documentatie :



  1. Afbeeldingen opslaan en ophalen in sql-serverdatabase via VB.NET

  2. MySQL-fout omzeilen Deadlock gevonden bij het proberen te vergrendelen; probeer de transactie opnieuw te starten

  3. Afbeelding toevoegen aan een database in Java

  4. PHP-sessie conflicteert met AJAX